首页 > 解决方案 > Spring Boot 应用程序中存储库的单元测试用例

问题描述

我对 UnitTest 和集成测试有点困惑 我知道下面的代码是集成测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = LavaMasterApplication.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class CurrencyServiceImplTest {

    @Autowired
    private CurrencyService currencyService;

    static CurrencyDTO currencyDTO = new CurrencyDTO();

    @BeforeClass
    public static void setUp() {
        currencyDTO.setCode("INR");
        currencyDTO.setName("Indian Rupee");
        currencyDTO.setNumber(12);
    }

    @Test
    public void testA_addCurrency() {
        CurrencyDTO dto = currencyService.addCurrency(currencyDTO);
        assertThat(dto).isEqualTo(currencyDTO);
    }
}

我如何为存储库或服务等相同的方法编写单元测试用例。我尝试使用以下无效的代码段。

@RunWith(MockitoJUnitRunner.class)
public class CurrencyServiceImplUT {

    @Mock
    CurrencyRepository repository;

    @Test
    public void testA_addCurrency() {
        Currency currency = new Currency();
        currency.setCode("IND");
        currency.setName("INDIA");
        currency.setNumber(1);
//        CurrencyRepository currencyRepository = mock(CurrencyRepository.class);
        when(repository.save(currency)).thenReturn(currency);
        List<Currency> all = repository.findAll();
        when(repository.findAll()).thenReturn(null);

    }
}

上面的代码不起作用,它在保存实体后返回 null 并且 findAll() 也为 null。

我需要为存储库和服务编写单元测试用例

标签: unit-testingspring-bootjunitintegration-testing

解决方案


我不知道CurrencyService您在向我们展示的单元测试示例中做了什么以及您尝试做什么,但是集成测试的等效单元测试将类似于:

public class CurrencyServiceTest {

    @Mock
    CurrencyRepository repository; // mock the repository

    @InjectMocks
    CurrencyService service; // use the real implementation and inject the @Mock's on it

    @Test
    public void testA_addCurrency() {

        Currency currency = new Currency();
        currency.setCode("IND");
        currency.setName("INDIA");
        currency.setNumber(1);

        when(repository.save(currency)).thenReturn(currency); //mocking the repository return

        CurrencyDTO currencyDTO = new CurrencyDTO();
        currencyDTO.setCode("INR");
        currencyDTO.setName("Indian Rupee");
        currencyDTO.setNumber(12);

        CurrencyDTO dto = currencyService.addCurrency(currencyDTO);
        assertThat(dto).isEqualTo(currencyDTO);

    }
}

正如我所说,我不知道这个测试对你是否有意义,但你的单元测试应该遵循这种代码。


推荐阅读