在我的项目中,我在进行单元测试时遇到了问题。一个问题是,仅仅进行联调就可以更快地编写,并且还可以测试组件是否真正协同工作。单元测试新颖的“算法”之类的似乎要容易得多。单元测试服务类感觉是错误和无用的。
我使用mockito来模拟spring数据存储库(以及DB访问)。问题是,如果我告诉模拟存储库在方法调用getById时返回实体A,它显然会返回实体A,服务也会返回实体A。是的,该服务做了一些额外的事情,但很小的事情,比如加载惰性集合(从hibernate)。显然,我在单元测试中没有任何惰性集合(代理)。
示例:
@Test
public void testGetById() {
System.out.println("getById");
TestCompound expResult = new TestCompound(id, "Test Compound", "9999-99-9", null, null, null);
TestCompoundRepository mockedRepository = mock(TestCompoundRepository.class);
when(mockedRepository.findOne(id)).thenReturn(expResult);
ReflectionTestUtils.setField(testCompoundService, "testCompoundRepository",
mockedRepository, TestCompoundRepository.class);
TestCompound result = testCompoundService.getById(id);
assertEquals(expResult, result);
}
万岁,其余的都成功了。真是个惊喜!不是真的不。
有人能解释一下我做错了什么吗?否则,这种测试的意义何在?我的意思是我告诉返回expResult,然后它就会被返回。哇!真是个惊喜!感觉我在测试mockito是否有效,而不是我的服务。
编辑:
我看到的唯一好处是,如果出现一些愚蠢的错误,比如在那里留下一行不需要的内容,将返回值设置为null或类似的愚蠢行为。这种情况将通过单元测试捕获。“回报-努力”比率似乎仍然很糟糕?
你可以使用这个库:https://github.com/agileapes/spring-data-mock
这将为您模拟存储库,同时允许您为任何方法以及本机查询方法实现自定义功能。
我喜欢测试我的Spring Data存储库的原因之一是为了测试我是否正确定义了我的JPA映射。我没有为这些测试使用模拟框架,我使用Spring Test框架,它实际上引导容器,允许我将实际存储库自动连接到JUnit测试中,以便我可以对其执行测试。
我同意您的想法,即嘲笑存储库是非常无用的。由于您使用Spring,我建议利用Spring Test框架对您的存储库执行真正的测试,这些测试可以针对嵌入式数据库(如H2)以更基于单元测试的方式执行,也可以针对您的实际数据库实现(如Oracle或MySql)执行更多联调。(针对开发数据库的副本执行这些测试)这些测试将揭示您的JPA映射和其他项目中的谬误,例如数据库中不正确的级联设置。
下面是我在GitHub上的一个测试示例。请注意框架实际上是如何将存储库自动连接到测试中的。存储库还包含一个如何配置Spring测试框架的示例,我在这篇博文中也演示了这个示例。
总之,我不相信您会从使用模拟存储库中获得我已经讨论过的测试存储库的任何好处。
我想补充的另一个注意事项是,mock并不是真正用于实际测试的类。它们的用途是为被测试的类提供所需的依赖关系。
这个问题可能有点老,但我会给出一个答案,以防有人偶然发现。
要测试您的服务和模拟Spring数据存储库,您需要以下内容。
package foo.bar.service.impl;
import foo.bar.data.entity.Account;
import foo.bar.data.repository.AccountRepository;
import foo.bar.service.AccountService;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class AccountServiceImplTest {
@Mock
private static AccountRepository accountRepository;
@InjectMocks
private static AccountService accountService = new AccountServiceImpl();
private Account account;
@Test
public void testFindAccount() {
Integer accountId = new Integer(1);
account = new Account();
account.setId(accountId);
account.setName("Account name");
account.setCode("Accont code");
account.setDescription("Account description");
Mockito.when(accountRepository.findOne(accountId)).thenReturn(account);
Account retrivedAccount = accountService.findAccount(accountId);
Assert.assertEquals(account, retrivedAccount);
}
}
我已经开始考虑在我的项目中围绕一些业务逻辑添加一些单元测试。 我想测试的第一个方法是服务层中的一个方法,它返回给定节点的子节点列表。 该方法如下所示: 我想象这样的测试方法是提供一个假树结构,然后测试提供节点是否返回正确的子节点。 ssdsContext是一个对象上下文。 我已经看到可以为提取和接口如何模拟ObjectContext或ObjectQuery 我还读到,as Entity Frame
我正在尝试对服务方法进行单元测试。服务方法调用spring数据存储库方法来获取一些数据。我想模拟这个存储库调用,并自己提供数据。如何做到这一点?在Spring Boot文档之后,当我模拟存储库并在测试代码中直接调用存储库方法时,模拟工作正常。但是,当我调用服务方法时,反过来调用存储库方法,mocking就不起作用了。下面是示例代码: 服务级别: 测试等级:
要从访问,我使用了一个带注释的接口,名为,该接口在需要时是。如果两者都在运行,则该服务将被Eureka发现。这对于所有服务都在运行的类似生产的设置很好。 但现在我想对我的的一些特性进行单元测试。启动一个测试服务并不成问题 就像我在中所做的那样。问题是Eureka依赖于我的的发现...因此我的testclass崩溃,因为自动执行的-实例不工作。 我能告诉Spring使用一个伪造的实例来进行测试吗?还
本文向大家介绍AngularJS 单元测试服务,包括了AngularJS 单元测试服务的使用技巧和注意事项,需要的朋友参考一下 示例 服务编号 考试 跑!
我正在尝试为服务层方法编写单元测试,按名称查找播放器。该方法调用JPA存储库方法并返回页面对象。我希望测试验证是否确实调用了存储库中的正确方法。 测试类 我的问题 测试失败,并显示以下消息: 根据建议,我将名称更改为eq(名称),但这导致了一个不同的问题: 有什么建议我应该在考试中改变什么? 服务类 存储库界面
我使用的是Spring Boot 1.5.2.Release,我的服务类注释为 我的单元测试类注释为: