java - 是否可以重用模拟?

标签 java mocking mockito

我有一个服务 ISOLanguageService,其方法为 getDefaultLanguage();

我想以这种方式在一个类 ISOLanguageServiceMock 中模拟此服务:

public class ISOLanguageServiceMock {

    @Mock
    private ISOLanguageService isoLanguageService;

    public ISOLanguageServiceMock() {

        MockitoAnnotations.initMocks(this);

        ISOLanguage isoLanguage = new ISOLanguage();
        isoLanguage.setLanguageCode("EN");
        when(isoLanguageService.getDefaultLanguage()).thenReturn(isoLanguage);
    }

然后我有其他服务 UserService 在其方法之一中使用此服务 isoLanguageService 。

public void doSomtthing() {
   return isoLanguageService.getDefaultLanguage()
}

我想测试 UserService,但我想以某种方式重用模拟 ISOLanguageServiceMock,因为它将在许多其他服务中使用。

我想要这样的东西

@RunWith(PowerMockRunner.class)
public class UserServiceTest {

    private ISOLanguageServiceMock languageMock = new ISOLanguageServiceMock();

    @InjectMocks
    private UserService userService;

    public void setUp() {
       MockitoAnnotations.init(this) 

    }

    public void testDoSomething() {

        userService.doDomething();
    }

}

我希望将 isoLanguageService 的模拟注入(inject)到 userService 中,但事实并非如此...

有没有办法重用模拟?我是否必须在每个测试类中编写 isoLanguageService 的模拟??

最佳答案

您不能以这种方式重用模拟。您需要将 @Mock 实例添加到您的测试用例中,并在其中使用它们。

含义:

@Mock
private ISOLanguageService isoLanguageService;

以及 UserServiceTest 类的规范。

Mockito 不理解(或不关心)您的 ISOLanguageServiceMock 类包含可以注入(inject)到被测类中的内容。 Mockito 会查找测试类中的模拟,然后将它们注入(inject),仅此而已!

关于重用方面:

  • 您可以通过子类化(拥有带有 @Mock 字段的基类)来做到这一点
  • 但是,从某种程度上来说,这是一种不好的做法。单元测试应该尽可能是独立的。当单元测试重复代码时,这是可以,因为您希望能够查看一个文件(您的测试用例)来了解发生了什么。

含义:(一般来说),单元测试中的代码重复并不是那么重要。单元测试的目标是实现快速调试。

好吧,一些替代方案:

  • 您当然可以不使用@InjectMocks。在这种情况下,您的生产代码需要另一种方式让您自己注入(inject)模拟对象(setter 或仅测试构造函数)。
  • 当您手动注入(inject)时,您当然可以注入(inject)任何您想要的模拟对象,甚至是来自另一个类的模拟对象
  • 但是:不需要额外的类,只需在某个地方有一个返回(预配置的)模拟的静态方法即可。

关于java - 是否可以重用模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51726419/

相关文章:

c# - 在模拟的 EF6 数据库中通过外键加载相关数据

java - 用数据填充 ResultSet 的简单方法

Java:如何在 Unicode Normal Form C 中创建一个字符串

java - Java 类加载器委派模型是强制性的吗?

Java IO user.dir Eclipse

android - MockitoAnnotations.initMocks 在 mock() 成功时崩溃

spring-boot - JUnit5 中 Mockito when(...).thenReturn(...) 的正确位置是哪个?测试本身或 @BeforeClass/@BeforeEach block ?

java - Tomcat 能否将 OutOfMemory 隔离到单个请求而不是“停止内存不足而不是装死”?

python - 如何在基于 Click 的 CLI 应用程序的单元测试中模拟组件?

java - 如何使用 Groovy stub Mockito 中的重载方法?