Java 如何在没有数据库的情况下测试自定义存储库层?测试正在通过,但方法没有得到覆盖
我正在开发一个存储库,该存储库实现Java加密体系结构并管理密钥库文件中的密钥。我试图避免在测试时使用外部依赖项,因此使用模拟测试。然而,在检查测试覆盖率时,这些似乎没有显示出来。只有直接链接到源代码而不使用mock的测试似乎才被涵盖 我想在我的测试中模仿,并且仍然实现测试覆盖率。我试过使用Mockito、Powermock、Powermockito 我还尝试对存储库使用varius模拟方法,如:Java 如何在没有数据库的情况下测试自定义存储库层?测试正在通过,但方法没有得到覆盖,java,spring-boot,unit-testing,mockito,keystore,Java,Spring Boot,Unit Testing,Mockito,Keystore,我正在开发一个存储库,该存储库实现Java加密体系结构并管理密钥库文件中的密钥。我试图避免在测试时使用外部依赖项,因此使用模拟测试。然而,在检查测试覆盖率时,这些似乎没有显示出来。只有直接链接到源代码而不使用mock的测试似乎才被涵盖 我想在我的测试中模仿,并且仍然实现测试覆盖率。我试过使用Mockito、Powermock、Powermockito 我还尝试对存储库使用varius模拟方法,如: private final EncryptionRepositoryImpl encryption
private final EncryptionRepositoryImpl encryptionRepositoryMock=mock(EncryptionRepositoryImpl.class)代码>
@SpringBootTest
管理密钥时的公共类{
@蚕豆
私钥管理存储库impl keyManagementRepository;
@自动连线
应用上下文上下文;
@试验
获取\u密钥\u别名()时公共无效引发异常{
List KeyAlias=new ArrayList();
添加(randomUUID().toString());
添加(randomUUID().toString());
添加(randomUUID().toString());
Mockito.when(keyManagementRepository.getkeyalases())。然后返回(keyalases);
KeyManagementRepositoryImpl repoFromContext=context.getBean(KeyManagementRepositoryImpl.class);
List keyAliasesRes=repoFromContext.getKeyAliases();
assertEquals(键别名、键别名);
验证(keyManagementRepository).getKeyAlias();
}
}
您的测试有一些错误。让我们在下面一步一步地做:
您正在为类型KeyManagementRepositoryImpl
@MockBean
私钥管理存储库impl keyManagementRepository;
然后,只要调用keyManagementRepository
实例中的getkeyalises()
方法,就模拟返回李>
Mockito.when(keyManagementRepository.getkeyalases())。然后返回(keyalases);
然后为类型KeyManagementRepositoryImpl
创建一个新实例(repoFromContext
),并从此实例调用方法GetKeyAlias
KeyManagementRepositoryImpl repoFromContext=context.getBean(KeyManagementRepositoryImpl.class);
List keyAliasesRes=repoFromContext.getKeyAliases();
上面这行从您创建的实例(repoFromContext
)调用该方法,而不是从模拟实例(keyManagementRepository
),您看到了吗
我建议您@Autowire
调用您的KeyManagementRepositoryImpl
的服务或任何组件,将模拟存储库注入此组件,然后在此组件中调用调用getkeyalases
的方法。它将使用您在Mockito中配置的返回。当
调用时。您好,我已尝试实现您描述的更改。测试确实通过了,但仍然没有得到覆盖。以下是我的更改:``@InjectMocks KeyManagementServiceImpl keyManagementService@Mock KeyManagementRepositoryImpl keyManagementRepository@Test public void Test(){//生成keyalases数组时(keyManagementRepository.getkeyalases())。然后返回(keyalases);列出keyalasesres=keyManagementService.getkeyalases();assertEquals(keyalases,keyalasesres);}``感谢您的帮助,希望您有机会看看这个@Vitor Cavalcantii而不是使用@InjectMocks
构造KeyManagementService
,尝试在服务的构造函数中构造通过模拟存储库的实例。类似于:KeyManagementService KeyManagementService=newkeymanagementserviceinpl(keyManagementRepository)代码>。我们尝试实现了这一点,但测试仍然没有得到覆盖@Test public void Test(){List keyalases=new ArrayList();keyalass.add(randomUUID().toString());keyalass.add(randomUUID().toString());keyalass.add(randomUUID().toString());Mockito.when(keyManagementRepository.getkeyalases())。然后返回(keyalases);List keyalasesres=keyManagementService.getkeyalases();assertEquals(keyalases,keyalasesres);}以下是变量:@MockBean KeyManagementRepositoryImpl keyManagementRepository@自动连线的公钥管理服务impl keyManagementService=新的keymanagementserviceinpl(keyManagementRepository)代码>
@SpringBootTest
public class When_managing_keys {
@MockBean
private KeyManagementRepositoryImpl keyManagementRepository;
@Autowired
ApplicationContext context;
@Test
public void when_getting_key_aliases() throws Exception {
List<String> keyAliases = new ArrayList<>();
keyAliases.add(randomUUID().toString());
keyAliases.add(randomUUID().toString());
keyAliases.add(randomUUID().toString());
Mockito.when(keyManagementRepository.getKeyAliases()).thenReturn(keyAliases);
KeyManagementRepositoryImpl repoFromContext = context.getBean(KeyManagementRepositoryImpl.class);
List<String> keyAliasesRes = repoFromContext.getKeyAliases();
assertEquals(keyAliases, keyAliasesRes);
Mockito.verify(keyManagementRepository).getKeyAliases();
}
}