java - 使用 mockito 将模拟注入(inject)抽象类

标签 java unit-testing dependency-injection ejb mockito

我正在模拟如下抽象类:

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

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

@InjectMocks 不适用于抽象类。

最佳答案

我为此使用 junit5。

我所做的是在 @BeforeEach 中使用 new abstractClass() 实例化抽象类,如果方法是通过 super 调用方法不是抽象的(使用它是因为我有 protected 方法),之后我使用 ReflectionUtils.setField() 在抽象类中设置模拟并测试每个方法和工作很不错。我留下一个有效的简单示例。

抽象类

public abstract class AbstractClass {
  @Autowired
  private Environment environment;

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

抽象类测试

@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);
  }
}

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

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

关于java - 使用 mockito 将模拟注入(inject)抽象类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32133102/

相关文章:

unit-testing - 使用 Azure DocumentDB 进行单元测试

javascript - 在nodejs中模拟Eventemitter

javascript - 如何处理影响 Jest 中其他测试的全局对象/测试

php - Symfony 2 EntityManager 注入(inject)服务

c# - 获取 Simple Injector 的容器实例

java - "proxied"状态对于 Hibernate session 意味着什么

java - 为什么没有ICMP指令?

java - 将指针位置传递给 Java 中的对象

dependency-injection - Autofac.Core.DependencyResolutionException

java需要正则表达式从字符串中提取周数