【发布时间】:2019-02-26 06:40:53
【问题描述】:
我有一个需要进行单元测试的服务类。该服务有一个上传方法,该方法依次调用更新数据库的其他服务(自动装配的 bean)。我需要模拟其中一些服务和一些按原样执行。
@Service
public class UploadServiceImpl implements UploadService{
@Autowired
private ServiceA serviceA;
@Autowired
private ServiceB serviceB;
public void upload(){
serviceA.execute();
serviceB.execute():
//code...
}
在上面的示例中,我需要模拟 ServiceA,但我希望 ServiceB 按原样运行并执行其功能。 我的 Junit 测试如下所示:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes=Swagger2SpringBoot.class)
public class UploadServiceTest {
@Mock
private ServiceA serviceA;
@InjectMocks
private UploadServiceImpl uploadService;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testUpload(){
uploadService.upload();
}
当我执行此操作时,我会在 serviceB.execute(); in UploadServiceImpl 获得 NPE。
可能是什么问题?
注意:我没有指定模拟对象的行为,因为我并不关心,而且模拟对象的默认行为是什么都不做。
谢谢!
【问题讨论】:
-
一起试试
@InjectMocks和@Autowired。 -
更多更干净,使用构造函数注入,并且您根本不需要 Spring 进行此测试。
-
嗯,既然你通过了
serviceA.execute();,那么也许你也应该@MockB(你在测试中嘲笑A。) -
@rustyx 使用
@InjectMocks和@Autowired注释服务工作!
标签: java spring-boot mockito