好吧,我必须实例化Controller才能对其进行测试。此外,我需要在该控制器中设置一些不是Spring bean的字段。 我找到了几种解决方法:
喜欢:
@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及其字段。
答案 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。