【发布时间】:2020-09-02 15:17:21
【问题描述】:
我正在使用 Spring 进行一些 Web 单元测试。有没有办法可以模拟在@PostConstruct 中设置的MyProcessor 实例?我尝试使用@MockBean,但它被设置为空并出现空指针异常?
我正在使用工厂根据一些布尔标志来实例化MyProcessor。但是,如果有一种完全不同的方法可以使我的测试更清晰,我愿意接受想法。
请注意我使用的是 Junit 5。
public class Controller {
private final AProcessorFactory factory;
@Value("${tt.f.processor.async}")
private boolean isAsync;
private MyProcessor myProcessor;
public Controller(final AProcessorFactory factory) {
this.factory= factory;
}
@PostConstruct
public void init() {
myProcessor = factory.getInstance(isAsync);
}
}
@WebMvcTest(Controller.class)
public class ControllerTest{
@MockBean
private MyProcessor processor;
@MockBean
private AProcessorFactory factory;
@Autowired
private MockMvc mockMvc;
@Test
public void test() throws Exception {
when(processor.process(any(Request.class), any(String.class)))
.thenReturn(new TestResponse("123", SUCCESS, "", ""));
}
【问题讨论】:
-
重构您的类以使用构造函数注入将有助于提高代码的可测试性。 PostConstruct 会让 JUnit 很难意识到这种注入。
-
在构造函数中将该标志设置为 swll
-
我将如何在我的测试类中模拟/设置它。异步标志和 MyProcessor 实例
-
@shinjw - 使用 junit5 和构造函数注入,它会是什么样子?可以举个例子吗