我试图覆盖我的整个测试环境与Mockito.spy功能,所以每当我想我可以存根一个方法,但所有其他调用去默认功能。这在服务层运行得很好,但是我在存储库层有问题。
我的设置如下:
Mockito-2.15.0 Spring-5.0.8 SpringBoot-2.0.4
存储库:
public interface ARepository extends CrudRepository<ADBO, Long> {}
服务:
@Service
public class AService {
@Autowired
ARepository aRepository;
public ADBO getById(long id) {
return aRepository.findById(id).orElse(null);
}
public Iterable<ADBO> getAll() {
return aRepository.findAll();
}
}
spy的配置:
@Profile("enableSpy")
@Configuration
public class SpyConfig {
@Bean
@Primary
public ARepository aRepository() {
return Mockito.spy(ARepository.class);
}
}
还有我的测试课:
@ActiveProfiles("enableSpy")
@RunWith(SpringRunner.class)
@SpringBootTest
public class AServiceTest {
@Autowired
AService aService;
@Autowired
ARepository aRepository;
@Test
public void test() {
ADBO foo = new ADBO();
foo.setTestValue("bar");
aRepository.save(foo);
doReturn(Optional.of(new ADBO())).when(aRepository).findById(1L);
System.out.println("result (1):" + aService.getById(1));
System.out.println("result all:" + aService.getAll());
}
}
现在,该测试有三种可能的结果:
>
aRepository是间谍(这就是我想要的):result(1):ADBO(id=null,testValue=null)result all:[ADBO(id=1,testValue=bar)]
我将此行为归因于以下事实:存储库的spring实例化在后台更加复杂,并且在调用Mockito时存储库没有正确实例化。间谍(ARepository.class)
。
我还尝试将正确的实例自动添加到Configuration中,并使用@autowmed对象调用Mockito.spy()
。
这导致:
Cannot mock/spy class com.sun.proxy.$Proxy75
Mockito cannot mock/spy because :
- final class
根据我的研究,Mockito可以从v2开始模拟和监视最终类。0.0.
调用Mockito。模拟细节(假设性)。isSpy()
返回true
,这让我觉得后台的对象没有正确实例化。
最后我的问题:
如何在我的UnitTest中使用@autowmed获得Spring数据存储库的间谍实例?
自Spring引导版本2.5.3以来,@SpyBean现在可以使用Spring数据存储库
如果无法升级,可以通过在测试方法主体中实例化spy来解决此问题:
var yourSpy = Mockito.mock(FooRepository.class, AdditionalAnswers.delegatesTo(real))
更新08/2021
您应该使用@SpyBean
。
它以前是坏的(参见下面问题的链接),但现在它已经被修复,并且从Spring Boot2.5开始就得到了支持。3
。
如果仍然出现此错误,并且无法更新Spring Boot版本,您可能希望尝试解决@Mateusz Zając在这个问题的一个答案中提出的问题。(请考虑他的回答,如果它对你有用)
链接到(关闭)问题:http://github.com/spring-projects/spring-boot/issues/7033
问题内容: 我正在尝试调用从pyodbc创建数据库的存储过程 以下是代码的最小示例 理想情况下,该代码应在SQL Server实例中创建一个名为“ Test ”的数据库。这不会产生任何错误。但是没有创建数据库。 跑步 问题答案: Python DB API2.0指定默认情况下,应在禁用自动提交的情况下打开连接。但是,许多数据库要求DDL语句 不在 事务内执行。尝试在禁用自动提交的情况下执行DDL语
经过安装Spring屋顶的痛苦。我正在尝试创建一个项目。然而,在通过spring shell创建了pojo之后,我现在正在创建spring存储库。我运行了以下命令来创建POJO 到目前为止一切都很好,但麻烦来了: 我立刻得到这个消息——实体选项应该是一个实体。我被卡住了。我尝试删除pojo并运行以下命令: 我得到的消息是:< code >“选项‘test automatically’,‘activ
我正在尝试从 Azure 机器学习工作室内部连接到 Azure SQL 数据库。根据 https://docs.microsoft.com/en-us/python/api/azureml-core/azureml.core.datastore.datastore?view=azure-ml-py,建议的模式似乎是使用Datastore.register_azure_sql_database方法创
主要内容:创建一个远程存储库在本章中,我们将看到如何创建一个远程Git仓库; 我们需要一个远程Git仓库来执行团队协作。这一篇文章很重要,直接影响到后面的章节的学习。所以,希望大家可先耐心地看完本章内容,并按本章一步步的操作。 创建一个远程存储库 我们将演示在 http://git.oschina.net/ 软件项目的托管平台上创建和初始化一个新的存储库。 注:你也可以使用 GitHub (http://github.com
我最近从使用预填充的DB切换到允许Hibernate创建我的表。当试图在我的data.sql中创建存储过程时,我得到以下错误: 我已经尝试添加
并将其添加到主存储库: 启动应用程序时,出现以下错误: 原因:org.SpringFramework.Data.Mapping.PropertyReferenceException:未找到类型Friends的属性findFriends!在org.springframework.data.mapping.propertypath.(propertypath.java:77)在org.springfr