繁体   English   中英

Spring 引导:如何测试使用 gson ZA8CFDE6331BD59EB2AC96F8911C4B666 的 class

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM