Pra*_*kar 40 java testng unit-testing mockito spring-boot
我正在使用TestNG测试业务服务,在春季启动应用程序中进行模拟单元测试.
应用程序是多模块弹簧启动项目.我正在为业务模块编写单元测试.
我在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>
Run Code Online (Sandbox Code Playgroud)
我的包装器注释看起来像
@Service
@Transactional
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface MyServiceAnnotation{}
Run Code Online (Sandbox Code Playgroud)
我的TestApp看起来像
@SpringBootApplication
public class TestApp{ .... }
Run Code Online (Sandbox Code Playgroud)
我的商业服务看起来像
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我不使用@Target(ElementType.TYPE),@Retention(RetentionPolicy.RUNTIME),@Inherited这些注解则在测试我的模拟DAO电话工作正常.
我明确需要上面的注释,因为如果我不使用它们,
例如,如果我想执行一个使用多个业务服务的单个任务,那么它们不会在一个事务中发生.换句话说,如果商务电话使用多个商业服务说ServiceA和ServiceB.呼叫从去serviceA到serviceB.如果在serviceB由于不serviceA回滚而完成的数据库更改中发生异常.
当我使用上面的注释时,上面的示例工作但是在junit测试中的模拟DAO调用不起作用.
我在pom中有错误的依赖吗?
Git Repository源代码,在这里你将得到示例代码.它在编译时给我一些错误.
小智 7
我建议你保持测试简单.您可以从DI中获益.有关详细信息,请访问Spring文档:
依赖注入的一个主要优点是它应该使您的代码更容易进行单元测试.您可以使用new运算符简单地实例化对象,甚至不涉及Spring.您还可以使用模拟对象而不是真正的依赖项.
您的测试类应如下所示.
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
您还应该在实现中检查空地址列表.测试失败,因为提供程序类为测试提供了没有初始化地址列表的用户实例.
@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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1653 次 |
| 最近记录: |