我在尝试进行一些自动化测试时遇到问题:我有一项服务(春季)。该服务提供了用于过程的公共方法。此过程由3个底层过程组成。这些进程使用私有方法,并正在调用其他服务。
我想测试这3个私有进程之一抛出错误时的行为。我发现Mockito可以帮助我。但是我不能使它工作。由于我的三个方法都是私有方法,因此无法使用PowerMock,因此我尝试在其他服务的公共方法上使用when()。thenThrow,这是由我的私有方法调用的。
我得到了各种各样的结果,NullPointerException,进程正常工作,没有任何抛出/错误,依赖项问题等。
我的代码如下:
@Test
public void test() throws Throwable {
Mockito.when(SecondServiceCalledByPrivateMethod.publicMethod(Mockito.any(), Mockito.any()))
.thenThrow(new Exception("failed!!!"));
request lRequest = createRequest(myObjects);
FirstService.executeProcess(lRequest);
}
使用配置类:
@Configuration
public class ConfigClass{
@Bean
@Primary
public SecondService secondService() {
return Mockito.mock(SecondService.class);
}
}
内部服务中,我有多个@Autowired等。我不知道这是否重要。这是我第一次尝试使用Mockito。 您是否知道如何使它起作用或我缺少什么?
编辑:我的服务如下:
@Service
class MyService {
@Autowired OtherService dependentService;
public someObject serviceMethod(Object2) {
//Some actions
callProcess(Object2);
}
private void callProcess(Object2) {
// other actions
dependentService.process(Object3);
}
}
它有多个对其他服务的调用(@Autowired)。我需要在测试中模拟/监视他们吗?
答案 0 :(得分:0)
您不能真正使服务的私有方法本身抛出异常。
用于这种事情的一般概念是模拟依赖项。
@Service
class MyService {
@Autowired OtherService dependentService;
public void serviceMethod() {
callProcess();
}
private void callProcess() {
dependentService.process();
}
}
@RunWith(MockitoRunner.class)
public class MyServiceTest {
// will be injected into the tested service by mockito
@Mock private OtherService dependentService;
@InjectMocks private MyService tested;
@Test
public void testExceptionOnCallProcess() {
// mock the exception being thrown by the other service
when(dependentService.process()).thenThrow(new RuntimeException());
tested.serviceMethod();
}
}
您使用自己的配置正在做的是创建一个实际的Spring上下文-这将使其成为集成测试,并且由于其中没有模拟,因此无法创建模拟异常。您必须通过创建环境来触发事件,然后通过相应地设置环境和数据来抛出事件。