首页 > 解决方案 > 如何使用spring和mockito获取被测对象的字段

问题描述

我有一个 spring 服务类,我在 @PostConstruct 方法下向 Executor 提交了一些任务。我写了一些测试,但它们的行为在所有运行中都不相同。有时都通过,有时尽管条件满足,但很少失败。

Class A {

   Private final ExecutorService executorService = Executors.newCachedThreadPool();

   private final Object obj1
   private final Object obj2;

  @Autowired
  public A(Object obj1, Object obj2) {
  this.obj1 = obj1;
  this.obj2 = obj2;
 }

 @PostConstruct
 public void process() {
   executorService.submit(() -> {
    obj1.doSomething();
    obj2.doOtherthing();
  });

 }

//Some other methods.....

}


Class ATest {

   A a;

   @Mock
   Object obj1;

   @Mock
   Object obj2;

   @Before
   public void setUp() {
      a = new A(Obj1, Obj2);
   }

  @Test 
  public void processTest {

      doNothing.when(obj1.doSomething);
      doNothing.when(obj1.doOtherthing);
      a.process();
      verify(obj1).doSomething();
      verify(obj2).doOtherthing();

 }

 @Test
 public void otherTest {

   //some test

 }

 }

所以我想在测试类中访问 executorService ,这样我就可以监控发生了什么,为什么测试表现不同。

任何建议或建议都会有所帮助。

标签: javaspringjunitmockito

解决方案


您可以为您创建一个包私有方法executorService,并在测试中使用它来获取executorService,但是您的测试类和被测类应该在同一个包中。

ExecutorService getExecutorService() {
   return executorService;
}

除此之外,您可以改用@InjectMocks注释@Before setUp()

@InjectMocks
private A a;

推荐阅读