在控制器中设置要在Spring Tests中使用的字段

时间:2018-11-06 11:08:22

标签: java spring spring-mvc spring-test

好吧,我必须实例化Controller才能对其进行测试。此外,我需要在该控制器中设置一些不是Spring bean的字段。 我找到了几种解决方法:


  • ReflectionTestUtils.setField()
  • 在控制器中创建构造函数并将其自动装配

喜欢:

@Autowired
public Controller(Player player) {
    this.player = player;
}

上述方法实际上对我不起作用,因为我不能自动连线,因为Player不是Spring Bean。

  • 在控制器中创建构造函数,而不是对其自动布线

这种方式:

    public Controller() {

    }

    public Controller(Player player) {
        this.player = player;
    }

此外,我必须创建一个无参数的构造函数。如果没有它,则会引发一些异常,例如,“无法加载ApplicationContext”


因此,毕竟,我决定使用最后一种方法,并且在测试中,我只是以这种方式实例化控制器:

public class ControllerTest {
    private Player player = new Player();

    private Controller controller = new Controller(player);
}

我基本上想知道的是我是否做对了所有事情。如果还有其他方法可以在Controller中设置字段(不是Spring Bean),并在测试中使用该Controller及其字段。

1 个答案:

答案 0 :(得分:1)

如果您使用Spring Boot,则可以使用@WebMvcTest来设置有限的Spring上下文,并可以使用@MockBean创建控制器所需的模拟bean,如Testing Web Layer示例中所述:

@RunWith(SpringRunner.class)
@WebMvcTest(Controller.class)
public class WebMockTest {

  @MockBean
  private Player player;

...

您应该避免使用ReflectionTestUtils.setField(),如果控制器对于单元测试很重要,则您的控制器应具有该字段的构造函数或setter。