有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    看起来myProcessor实际上是由AProcessorFactory在PostConstruct init()方法中构建的

    您需要为AProcessorFactorymock提供一个行为

    首先,您可能希望在构造函数中设置myProcessor,因为@PostConstruct{}方法没有特殊的上下文加载逻辑

    public class Controller {
    
        @Value("${tt.f.processor.async}")
        private boolean isAsync;
    
        private MyProcessor myProcessor;
    
        public Controller(final AProcessorFactory factory) {
            this.myProcessor = factory.getInstance(isAsync);
        }
    }
    

    您可以在测试的@Before步骤中指定这一点

     @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模拟