- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在使用 TestNG 测试业务服务,在 Spring Boot 应用程序中进行模拟单元测试。
应用程序是多模块spring boot项目。我正在为业务模块编写单元测试。
我在pom中添加了以下依赖相关的测试,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>${testng.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>el-api</artifactId>
<version>${javaxel.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.servlet</artifactId>
<version>${javax.servlet.version}</version>
<scope>test</scope>
</dependency>
我的包装注释看起来像
@Service
@Transactional
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface MyServiceAnnotation{}
我的 TestApp 看起来像
@SpringBootApplication
public class TestApp{ .... }
我的业务服务看起来像
@MyServiceAnnotation
public class AddressServiceImpl implements AddressService {
@Autowire
UserDAO userDAO;
@Autowire
AddressDAO addressDAO;
public Address find(int userId) {
user = userDAO.findOne(userId);
/** if I run following test then I get user NULL.
But it should get user object which I have created
in data provider
**/
if(user == null ) { throw new BadReqExcp("invalid user Id", 101); }
address = user.findAddresses();
if(address is empty) { throw new BadReqExcp("add not found", 102);}
return address;
}
}
MyTestClass 看起来像
@ContextConfiguration(classes = { TestApp.class })
class MyTestClass{
@Mock
UserDAO userDAO;
@InjectMocks
@Autowire
AddressService addressServie;
@BeforeMethod
public void initMock() {
MockitoAnnotations.initMocks(this);
}
@Test(dataProvider = "getUser", dataProviderclass = UserDP.class)
public void shouldThrowExceptionAddressNotFound(int userId, User user)
{
when(userDAO.findOne(userId)).thenReturn(user); //here dao call should return user but it is returning null
try{
addressService.find(userId);
}
catch(BadReqExcp e){
// Here errro code should be 102 but fount 101
assertEquals(e.getErrorCode(), 102);
}
}
}
如果我不使用@Target(ElementType.TYPE)
、@Retention(RetentionPolicy.RUNTIME)
、@Inherited
这些注解然后我在测试中的模拟 DAO 调用工作正常。
我需要上面的注释,因为如果我不使用它们,那么,
例如,如果我想执行一个使用多个业务服务的单个任务,那么 它们不会发生在一个事务中。换句话说,如果一个业务调用使用多个业务服务,例如 ServiceA
和 ServiceB
。调用从 serviceA
转到 serviceB
。如果 serviceB
发生异常,则 serviceA
所做的数据库更改不会回滚。
当我使用上面的注释时,上面的例子可以工作,但是在 junit 测试中模拟 DAO 调用不起作用。
我在 pom 中是否有错误的依赖项?
Git Repository Source Code ,在这里你会得到示例代码。它在编译时给了我一些错误。
最佳答案
我建议您保持测试简单。您可以从 DI yield 中获利。更多详情请访问Spring documentation :
One of the major advantages of dependency injection is that it should make your code easier to unit test. You can simply instantiate objects using the new operator without even involving Spring. You can also use mock objects instead of real dependencies.
您的测试类应该如下所示。
public class AddressTest {
@Mock
private UserDAO userDAO;
@Mock
private AddressDAO addressDAO;
@InjectMocks
private AddressService addressServie;
@BeforeMethod
public void initMock() {
addressServie = new AddressServiceImpl();
MockitoAnnotations.initMocks(this);
}
@Test(dataProvider = "getUser", dataProviderClass = UserDP.class)
public void shouldThrowExceptionAddressNotFound(int userId, User user) {
when(userDAO.findOne(userId)).thenReturn(user);
try {
addressServie.findAllAddress(userId);
} catch (BadRequestException badRequestException) {
assertEquals(badRequestException.getErrorCode(), 102);
}
}
}
您还应该在您的实现中检查空地址列表。测试失败,因为提供者类为测试提供了一个未初始化地址列表的用户实例。
@Override
public List<Address> findAllAddress(int userId) {
User user = userDAO.findOne(userId);
if (user == null) {
throw new BadRequestException("Invalid user id", 101);
}
List<Address> addresses = user.getAddresses();
if (addresses == null || addresses.isEmpty()) {
throw new BadRequestException("Address Not found", 102);
}
return addresses;
}
关于java - 注释服务以使用@Retention、@Transactional、@Inherited 进行测试后,TestNG 单元测试不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31315433/
以下两种保留配置之间有什么区别? offsets.retention.minutes log.retention.minutes 我不知道它有什么不同或相互联系。据我了解,一旦偏移量被删除,日志中的记
在文档中 log.cleaner.delete.retention.ms: How long are delete records retained? log.retention.ms: The nu
我正在考虑为我的应用使用 Firebase Analytics。我很好奇: 保留的标准是什么?保留是否跟踪具有我必须发送的唯一 ID 或唯一设备的用户帐户? 如果用户从多个设备登录到我的应用程序,我将
是否可以有一个配置,其中给定名称或类型的所有注释自动RetentionPolicy.RUNTIME ? 我遇到了一个问题,我需要在运行时使用反射来搜索某些注释。但这些是分散在应用程序各处的常见注释,例
在java中的@Retention注解的源代码中,@Retention是在其定义本身中使用的,这怎么可能。 连 RetentionPolicy 都设置在RUNTIME,那么它怎么可能在它还没有准备好运
Java 8 类型注释 (JSR 308) 允许类型检查器执行静态代码分析。例如,The Checker Framework可以通过 @NonNull 注释检查可能的nullness。 各个项目定义了
根据Kotlin language spec ,有三种类型的注释保留: Source retention (accessible by source-processing tools); Binary
有没有办法在配置文件中指定 storage.tsdb.retention 标志而不是在命令行上传递?我针对不同的情况有不同的配置文件,如果我也可以在配置文件中指定 storage.tsdb.reten
这段代码中这些java.lang.annotation导入的目的是什么?为什么需要它们来定义 MyAnnotation? import java.lang.annotation.Documented;
我想在 Prometheus 2.12 中尝试 storage.tsdb.retention.size 的特性。 我的 prometheus 保留配置是 90 天或 2GiB。我的预期是当 prome
Firebase 通过 Firebase 远程配置提供拆分测试功能,但无法过滤具有用户属性(实际上具有任何属性)的同类群组部分中的保留。 为了寻求这个问题的解决方案,我正在寻找 BigQuery,因为
我正在使用 Insights 来分析我的用户保留率,如 described on this guide它非常适合按天/周或长达 3 个月来衡量保留率。 但是我如何获得 6 个月的保留数? 最佳答案 确
我想要一个只接受 2 个值的函数,比如说一个和两个。我可以为它使用枚举,但对于 Android,使用常量 (@IntRef) 被认为更好。 所以我这样做了: @Retention(RetentionP
我被要求为我的 prometheus 的 storage.tsdb.retention.time 提供最小值。我给它作为 1d。我们能不能给值(value)低于这个。我的意思是我们可以为这个标志指定以
我试图了解 Java 1.5 的保留策略。但没有得到清晰的图片。 作为per JavaDoc , CLASS - 注释将被记录在类文件中编译器,但不需要在运行时由 VM 保留。 RUNTIME - 注
我正在尝试使用 Java 在 Kafka 中的压缩主题上实现一个最小的工作示例。我的压缩运行良好,但是当我按照 kafka 文档中的描述使用键和空值编写消息时,看不到删除发生。 使用的库版本:kafk
的主要作用之一log.retention.byte 参数是避免 kafka 磁盘已满,或者换句话说,清除数据日志以避免 kafka 磁盘已满 根据以下链接: https://docs.hortonwo
所以我试图为创建一个别名 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface ApiRe
我正在使用 TestNG 测试业务服务,在 Spring Boot 应用程序中进行模拟单元测试。 应用程序是多模块spring boot项目。我正在为业务模块编写单元测试。 我在pom中添加了以下依赖
我有最近7天涌入的数据。我应用了保留政策,突然所有数据被删除。我有大量的Influx执行个体。 CREATE RETENTION POLICY stats_30_day ON server_stats
我是一名优秀的程序员,十分优秀!