繁体   English   中英

对具有构造函数和需要使用 mockito 模拟的自动装配字段的类的方法进行单元测试

[英]Unit testing a method of a class that has a constructor and an autowired field that needs to be mocked using mockito

我有一个服务类,它使用构造函数扩展另一个服务。 这个类有一个自动装配的字段和一个我想使用 Mockito 进行单元测试的方法。 但是,我在为它编写一个单元时遇到了麻烦。

假设服务看起来有点像这样:

@Service
public class SomeService extends Service {

    @Autowired
    private SomeClient someClient;

    public SomeService(Product product, @Qualifier(Constants.SOME_BEAN) Details temp) {
        super(product, temp);
    }
    @Override
    public State create() {
        Request request = new Request();
        request.set...
        request.set..

        Status status = someClient.createTenant(request);
        ..
        .. // construct a State object and return
    }
}

现在,我正在为这个类编写一个测试,我正在尝试对上面的 create() 方法进行单元测试。 当我的测试调用此方法时,我无法在那里模拟 someClient。

测试类看起来有点像:

@RunWith(MockitoJUnitRunner.class)
public class SomeServiceTest {
    private Detail temp;

    private SomeFacade service;

    private SomeClient someClient;

    private Product product;

    @Before
    public void setup() {
        temp = mock(Details.class);
        product = mock(Product.class);
        service = spy(new SomeService(product, temp));
        someClient = mock(SomeClient.class);
    }

    @Test
    public void test() {
        Status status = new Status();
        status.setStatus(...);
        when(someClient.createTenant(any())).thenReturn(status);
        State state =  service.create();

        // asserts
    }
}   

我想要的是,当我在上面的测试中调用 service.create 时,调用someClient.createTenant(request); 在测试的方法中应该被模拟以返回一个值,这是我无法工作的事情。 有什么帮助吗?

我们可以使用 Mockito 的@InjectMocks -annotation@InjectMocks注入到我们的测试单元中。 为此,我们还需要

  • setup()方法中删除模拟初始化和
  • @Mock注释@Mock

评论:

  • 我会推荐构造函数注入,而不是字段注入 除其他外,这允许保留代码结构并通过手动注入在setup()创建被测单元
  • 我还建议在when添加一个类型: when(someClient.createTennant(any(Request.class)))...
  • 正如@second 所指出的,对被测单元的spy是多余的。
  • @second 还指出,如果存在构造函数,则字段注入将不起作用

暂无
暂无

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

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