Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.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 如何在RestController类中模拟私有变量_Java_Spring_Junit_Mockito - Fatal编程技术网

Java 如何在RestController类中模拟私有变量

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

我正在用Spring做一些web单元测试。有没有一种方法可以模拟在
@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和构造函数注入,它会是什么样子?你能举个例子吗