使用Mockito将模拟注入到Abstract类

Dil*_*sha 5 java unit-testing dependency-injection ejb mockito

我在嘲笑一个抽象类,如下所示:

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

问题是MyAbstractClass通过EJB批注注入了一些依赖项,而没有设置器。有没有办法注入依赖项?

@InjectMocks 不适用于Abstract类。

小智 5

我为此使用junit5。

new abstractClass()我所做的是用in实例化抽象类,如果该方法不是抽象的,则@BeforeEach 调用方法(使用它是因为我有方法),之后我用来在抽象类中设置模拟并测试每个方法并且工作得很好出色地。我留下一个有效的简单例子。superprotectedReflectionUtils.setField()

抽象类

public abstract class AbstractClass {
  @Autowired
  private Environment environment;

  protected String getProperty(String property){
    return environment.getRequiredProperty(property);
  }
}
Run Code Online (Sandbox Code Playgroud)

抽象类测试

@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);
  }
}
Run Code Online (Sandbox Code Playgroud)

这只是使用mockito和junit5来测试。请记住ReflectionUtils在实例化类后调用new AbstractClass(),否则不会注入模拟。

欢迎对此实施的任何改进:D。


Cra*_*aig 1

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

  • 抽象类有一些实现的方法可供测试 (10认同)
  • 如果您有一个扩展抽象类的实现类,那么只需使用该类来测试抽象类中的方法即可。 (2认同)