java如何在RestController类中模拟私有变量
我正在用Spring做一些web单元测试。有没有一种方法可以模拟MyProcessor
的实例,它是在@PostConstruct
中设置的?我试过使用@MockBean
,但它被设置为null,并且得到null指针异常
我正在使用一个工厂根据一些布尔标志实例化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, "", ""));
}
# 1 楼答案
看起来
myProcessor
实际上是由AProcessorFactory
在PostConstruct init()方法中构建的您需要为
AProcessorFactory
mock提供一个行为首先,您可能希望在构造函数中设置}方法没有特殊的上下文加载逻辑
myProcessor
,因为@PostConstruct
{您可以在测试的
@Before
步骤中指定这一点Spring将注册已加载适当行为的ProcessorFactory模拟