[英]Spring Boot: How to test a class which is using gson object using autowiring
我是 JUnit 和 java 中的单元测试的新手。 我在测试我的代码时遇到问题。 任何帮助表示赞赏。
我的 java class: 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);
}
}
我的测试 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());
}
}
这是给 NullPointerException 因为gson
object 没有得到初始化。 我们也不能模拟gson
因为Gson
class 是final
的。
我该如何测试这段代码。 我正在使用spring 引导和junit5。
更好的可测试性方法是将Gson
object 传递给服务的构造函数(即构造函数依赖注入):
private ServiceB serviceB;
private Gson gson;
@Autowired
AService(ServiceB serviceB, Gson gson) {
this.serviceB = serviceB;
this.gson = gson;
}
Spring 仍会使用GsonAutoConfiguration
配置 ZA2F2ED4F8EBC2CBB4C21A29DC4Z 正常注入Gson
object。 但是,在您的测试中,您现在可以使用常规Gson
object 构建AService
:
AService aService = new AService(serviceB, new GsonBuilder().create());
注意:我使用new GsonBuilder().create()
创建Gson
object 因为这是GsonAutoConfiguration
在生产中注入它所做的。 但是您也应该能够使用简单new Gson()
创建它:
AService aService = new AService(serviceB, new Gson());
我不推荐 mocking Gson
而不是你可以创建和设置Gson
RefelectionUtils
服务使用其他依赖项 1C 和 B66 模拟服务
@ExtendWith(MockitoExtension.class)
public class AServiceTest {
private ServiceB serviceB = Mocktio.mock(ServiceB.class);
private Gson gson = new GsonBuilder().create();
private AService aService = new AService();
@Before
public void setup() {
ReflectionTestUtils.setField(aService, "serviceB", serviceB);
ReflectionTestUtils.setField(aService, "gson", gson);
}
@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());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.