Java 无法在WebMVCTest中使用MockBean连接依赖项
我有一个控制器类:Java 无法在WebMVCTest中使用MockBean连接依赖项,java,spring-boot,junit,mockito,junit5,Java,Spring Boot,Junit,Mockito,Junit5,我有一个控制器类: public class Controller { private final IProcessor processor; public Controller (final ProcessorFactory factory) { this.processor = factory.getInstance(); } } 提供IPProcessor不同实例的Factory类: @Component public class Proces
public class Controller {
private final IProcessor processor;
public Controller (final ProcessorFactory factory) {
this.processor = factory.getInstance();
}
}
提供IPProcessor不同实例的Factory类:
@Component
public class ProcessorFactory {
private final Dep1 dep1;
private final Dep2 dep2;
public ProcessorFactory (final Dep1 dep1,
final Dep2 dep2) {
this.dep1= dep1;
this.dep2= dep2;
}
public IProcessor getInstance() {
if (...) {
return new ProcessorA(dep1, dep2);
}
return new ProcessorB(dep1, dep2);
}
}
在使用Junit5的mockito测试类中,我无法实例化IProcessor
成员,并且为空:
@WebMvcTest(Controller.class)
public class ControllerTest {
@MockBean
private ProcessorFactory processorFactory ;
@MockBean
private IProcessor processor;
@Autowired
private MockMvc mockMvc;
@Test
public void test1() throws Exception {
when(processor.process(any(Request.class), any(String.class)))
.thenReturn(new BlaBla("Test", "Test"));
String request = ...
this.mockMvc.perform(post("/test/test").contentType(MediaType.APPLICATION_JSON).content(request))
.andDo(print())
.andExpect(status().is2xxSuccessful());
}
}
我不确定我是否正确使用了MockBean。基本上,我想模拟工厂和处理器。因为在Spring上下文初始化期间(在
控制器的构造函数中)需要调用模拟方法(getInstance()
),所以需要以不同的方式模拟所述方法。模拟bean不仅必须作为现有对象提供,还应该定义其模拟行为
另外,IProcessor
实现没有配置为SpringBean,因此Spring不会注入它们-ProcessorFactory
显式调用new
,并在没有Spring参与的情况下创建对象
我创建了一个简单的项目来重现您的问题并提供解决方案-如果您想检查整个过程是否正常,您可以找到它,但下面是最重要的测试片段(我简化了一些方法):
@WebMvcTest(Controller.class)
class ControllerTest {
private static final IProcessor PROCESSOR = mock(IProcessor.class);
@TestConfiguration
static class InnerConfiguration {
@Bean
ProcessorFactory processorFactory() {
ProcessorFactory processorFactory = mock(ProcessorFactory.class);
when(processorFactory.getInstance())
.thenReturn(PROCESSOR);
return processorFactory;
}
}
@Autowired
private MockMvc mockMvc;
@Test
void test1() throws Exception {
String result = "this is a test";
when(PROCESSOR.process(any()))
.thenReturn(result);
mockMvc.perform(post("/test/test")
.contentType(MediaType.APPLICATION_JSON)
.content("{}"))
.andDo(print())
.andExpect(status().is2xxSuccessful())
.andExpect(content().string(result));
}
}