我是JUnit和java中的单元测试的新手。我在测试我的代码时遇到了一个问题。任何帮助都将不胜感激。
我的java类:AService.java
@Service
public class AService {
@Autowired
private ServiceB serviceB;
@Autowired
private Gson gson;
public MyEntity getEntity() {
String jsonResponse = serviceB.getResponse();
return gson.fromJson(jsonResponse, MyEntity.class);
}
}
我的测试类:AServiceTest.java
@ExtendWith(MockitoExtension.class)
public class AServiceTest {
@Mock
private ServiceB serviceB;
@Autowired
private Gson gson;
@InjectMocks
private AService aService;
@Test
public void getEntityTest() {
String serviceBResponse = "{\"id\":55,\"name\":\"My entity\",\"address\":\"XYZ\"}";
when(serviceB.getResponse()).thenReturn(serviceBResponse);
MyEntity entity = aService.getEntity();
assertEquals("My entity", entity.getName());
}
}
由于gson
对象未被初始化,这将引发NullPointerException。此外,我们不能将gson
模拟为Gson
类是final
。
我如何测试这段代码。我正在使用spring Boot 和junit5。
2条答案
按热度按时间lp0sw83n1#
我不建议模仿
Gson
,相反,您可以使用RefelectionUtils
创建和设置Gson
对象,并模仿其他依赖项服务brqmpdu12#
更好的可测试性方法是将
Gson
对象传递给服务的构造函数(即constructor dependency injection):Spring仍然会使用
GsonAutoConfiguration
配置类正常地注入Gson
对象,但是在您的测试中,您现在可以使用常规的Gson
对象来构造AService
:注意:我使用
new GsonBuilder().create()
创建Gson
对象,因为GsonAutoConfiguration
就是这样将其注入生产环境的。但是,您也可以使用new Gson()
创建它: