使用mockito将模拟注入抽象类

时间:2015-08-21 05:42:28

标签: java unit-testing dependency-injection ejb mockito

我正在嘲笑如下的抽象类:

myAbstractClass = Mockito.mock(MyAbstractClass.class, Mockito.CALLS_REAL_METHODS);

问题是MyAbstractClass有一些通过EJB注释注入的依赖项,并且没有setter。有没有办法注入依赖项?

@InjectMocks不适用于抽象类。

4 个答案:

答案 0 :(得分:1)

由于无法实例化Abstract类,因此无需测试。我建议您创建子类(它可以是测试类中的嵌套类),然后以这种方式运行测试。然后,您可以像平常一样使用@Mock@InjectMocks

答案 1 :(得分:0)

您可以使用Powermock库使用myAbstractClassWhitebox.setInternalState(myAbstractClass, mock(MockedClass.class))中注入模拟;

答案 2 :(得分:0)

我正在为此使用junit5。

我所做的是在new abstractClass()中用@BeforeEach实例化抽象类,如果方法不是抽象的,则用super调用方法(使用此方法是因为我有{{1} }方法),此后,我使用protected在抽象类中设置模拟,并测试每个方法,并且效果很好。我留下一个简单的例子。

AbstractClass

ReflectionUtils.setField()

AbstractClassTest

public abstract class AbstractClass {
  @Autowired
  private Environment environment;

  protected String getProperty(String property){
    return environment.getRequiredProperty(property);
  }
}

这只是使用Mockito和junit5进行测试。 记住用@ExtendWith(MockitoExtension.class) class AbstractClassTest { AbstractClass abstractClass; @Mock Environment environment; @BeforeEach void setUp() { abstractClass = new AbstractClass() { @Override public String getProperty(String property) { return super.getProperty(property); } }; ReflectionTestUtils.setField(abstractClass, "environment", environment); } @Test void shouldReturnProperty() { String propertyValue = "this property"; when(environment.getRequiredProperty("property")).thenReturn(propertyValue); String property = abstractClass.getProperty("property"); assertEquals(propertyValue, property); } } 实例化类后再调用ReflectionUtils,否则模拟不会被注入。

欢迎对此实现进行任何改进:D。

答案 3 :(得分:-1)

良好的做法是为从该抽象类继承的所有可能类编写单元测试。因为在理论上它是可能的情况。应该模拟这种依赖关系,你应该忘记模拟这个EJB组件的依赖关系。 也许一些代码片段有助于澄清你在这里尝试实现的目标。