Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法在WebMVCTest中使用MockBean连接依赖项_Java_Spring Boot_Junit_Mockito_Junit5 - Fatal编程技术网

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));
    }

}