问题描述
我有一个抽象类,其中包含许多具有业务逻辑的方法。 在编写 Junits 时,我通过创建具有对实际方法的调用的 Mock 来测试抽象类。 在我的 Junit 中,我不想创建一个具体的类来测试抽象类方法,因为那样我的 Junit 测试用例会得到一些我不想要的行为。
我正在使用它来实现一个模拟来调用我的抽象类。
Mockito.mock(AbstractService.class,Mockito.CALLS_REAL_METHODS)
但我的问题是,我的抽象类有很多自动装配的依赖项。
子类是 @component
。现在,如果它不是抽象类,我会使用@InjectMocks 来注入这些模拟依赖项。但是如何向我上面创建的这个实例添加模拟。
此处简化代码版本/
abstract class AbstractService{
@Autowired
DependencyOne dp1;
@Autowired
private DependencyOne dp2;
public void doSometingSpecial(){
dp1.Dosomething(dp2.dosomethingElse())
.....
.....
}
}
我的 Junit 是
@ExtendWith(SpringExtension.class)
@TestInstance(Lifecycle.PER_CLASS)
class AbstractServiceTest {
@Mock
private DependencyOne dp1;
@Mock
private DependencyOne dp2;
.....
.....
@Test
void testDirectCall_whenSomething_thenSomerhing(){
AbstractService service = Mockito.mock(AbstractService.class,Mockito.CALLS_REAL_METHODS);
//How to inject dep1 and dp2 mock to write junit for doSometingSpecial()
}
}
解决方法
只需为父类单独添加注入模拟
@InjectMocks
AbstractService abstractService;
内部测试方法给出,
@Test
void testDirectCall_whenSomething_thenSomerhing(){
when(myAbstractClass.doSometingSpecial()).thenReturn("good");
Assert.assertEquals("good",myAbstractClass.doSometingSpecial());
}
不需要
AbstractService service = Mockito.mock(AbstractService.class,Mockito.CALLS_REAL_METHODS);
在进口请添加
import static org.mockito.Mockito.*;