Java 如何在RestController类中模拟私有变量
我正在用Spring做一些web单元测试。有没有一种方法可以模拟在Java 如何在RestController类中模拟私有变量,java,spring,junit,mockito,Java,Spring,Junit,Mockito,我正在用Spring做一些web单元测试。有没有一种方法可以模拟在@PostConstruct中设置的MyProcessor实例?我尝试了@MockBean,但它被设置为null,并且得到null指针异常 我正在使用一个工厂根据一些布尔标志实例化MyProcessor。但如果有一种完全不同的方法可以让我的测试更干净,我愿意接受这些想法 请注意,我使用的是JUnit5 public class Controller { private final AProcessorFactory fa
@PostConstruct
中设置的MyProcessor
实例?我尝试了@MockBean
,但它被设置为null,并且得到null指针异常
我正在使用一个工厂根据一些布尔标志实例化MyProcessor
。但如果有一种完全不同的方法可以让我的测试更干净,我愿意接受这些想法
请注意,我使用的是JUnit5
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, "", ""));
}
看起来您的
myProcessor
实际上是由您的AProcessorFactory
在PostConstruct init()方法中构建的
您需要为AProcessorFactory
mock提供行为
首先,您可能希望在构造函数中设置myProcessor
,因为@PostConstruct
init()
方法没有特殊的上下文加载逻辑
public class Controller {
@Value("${tt.f.processor.async}")
private boolean isAsync;
private MyProcessor myProcessor;
public Controller(final AProcessorFactory factory) {
this.myProcessor = factory.getInstance(isAsync);
}
}
您可以在测试中的@之前的步骤中指定此项
@MockBean
private AProcessorFactory factory;
@Before
public void setUp() {
when(processor.process(any(Request.class), any(String.class)))
.thenReturn(new TestResponse("123", SUCCESS, "", ""));
when(factory.getInstance(any())).thenReturn(processor)
}
Spring将注册一个加载了适当行为的ProcessorFactory模拟。Junit5的效果如何@BeforeAll可以与PostConstruct一起使用吗?只需在Before步骤中就可以了。重构类以使用构造函数注入将有助于提高代码的可测试性。PostConstruct将使JUnit很难意识到这种注入。在构造函数中设置该标志,然后在测试类中模拟/设置该标志。async标志和MyProcessorinstance@shinjw-使用junit5和构造函数注入,它会是什么样子?你能举个例子吗