我正在嘲笑如下的抽象类:
myAbstractClass = Mockito.mock(MyAbstractClass.class, Mockito.CALLS_REAL_METHODS);
问题是MyAbstractClass
有一些通过EJB
注释注入的依赖项,并且没有setter。有没有办法注入依赖项?
@InjectMocks
不适用于抽象类。
答案 0 :(得分:1)
由于无法实例化Abstract类,因此无需测试。我建议您创建子类(它可以是测试类中的嵌套类),然后以这种方式运行测试。然后,您可以像平常一样使用@Mock
,@InjectMocks
。
答案 1 :(得分:0)
您可以使用Powermock库使用myAbstractClass
在Whitebox.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组件的依赖关系。 也许一些代码片段有助于澄清你在这里尝试实现的目标。