繁体   English   中英

Mockito间谍不适用于工厂bean方法

[英]mockito spy does not work on a factory bean method

我有一个Springboot,我正在为此编写单元测试。 有一个factoryBean,我可以在其中获取服务对象。 我想测试该服务对象上的特定方法是否被调用。 这是应用程序代码

@Component
public class AppClient {

    @Autowired
    ServiceFactory factory

    Service secretService

    @postContruct
    public void init(){
        this.secretService=factory.get("secret");
    }

    public void process(Map<String, Object> param){
        for (String key: param.keySet()){
            if (key.equals("foobar")){
                restService.handle(param.get(key));
            }
        }
    }
}

这是我的单元测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class AppTest {

  @Autowired
  AppClient appClient;

  @SpyBean
  ServiceFactory factory;

  Service secretService;

  @Before
  public void init(){
    this.secretService=Mockito.spy(factory.get("secret"));
  }

  @Test
  public void testProcess() {
    Object obj = new MyDummyObject();
    Map<String, Object> params = new HashMap<>();
    params.put("foobar", obj);
    appClient.process(params);
    Mockito.verify(secretService).handle(obj);
  }
}

测试失败,当我通过调试器运行时,我看到该句柄被调用。 那么这是怎么了?

编辑

@MockBean
ServiceFactory factory;

@Mock
Service secretService

@Before
public void init(){
  Mockito.when(factory.get(eq("secret"))).thenReturn(secretService);
}

进行此更改后,将模拟工厂bean,但AppClient中的secretService为null。 也就是说,secretService没有通过调试器进行存根测试。

在Spring应用程序完全运行之前以及测试类对工厂模拟进行一些准备之前,将执行PostConstruct回调。 您无法在PostConstruct回调中运行的代码上声明Mockito when().then()期望值。

我可以建议您在AppClient bean中进行基于构造函数的注入:

@Component
public class AppClient {

    private final ServiceFactory factory

    @Autowired
    public AppClient(ServiceFactory factory){
       this.factory = factory;
    }

    ...
}

并将其作为简单的单元测试进行测试。 通过手动创建AppClient的实例,注入工厂的模拟,执行init方法并验证所需的全部内容:

@Test
void initTest(){
  when(factory.get(..)).thenReturn(..);

  AppClient client = new AppClient(factory);
  client.init();

  verify(..)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM