在项目测试中遇到个问题。
项目使用CDI+Mybatis。
使用arquillian+testng进行测试。
单个TestNG测试运行良好(通过mvn test -Dtest=xxxServiceTest指定测试类);多个TestNG测试报错(如前,不指定测试类)。初步分析,问题出在arquillian的@Deployment产生上。一个典型的Arquillian+TestNG用例如下:
public class UserServiceTest extends TestNGBase<User> {
@Inject
private UserService userService = null;
@Deployment(name = "userServiceTest",order = 15)
public static JavaArchive createDeployment() {
return ShrinkWrap.create(JavaArchive.class, "test1.jar")
.addClass(UserServiceImpl.class)
.addClass(LogFactory.class)
.addClass(SqlSessionFactoryProvider.class)
.addClass("org.mybatis.cdi.SqlSessionManagerRegistry")
.addAsResource("test_jdbc.properties")
.addAsResource("mybatis-config.xml")
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
}
@Override
@Test
@BeforeMethod
public void checked() {
Assert.assertNotNull(userService);
}
@Override
@Test(dependsOnMethods = "checked")
public void testCreate() {
createOneUser("zhangsan", "zhangsan", "zhangsan@qq.com", "salt1");
createOneUser("lisi", "lisi", "lisi@qq.com", "salt2");
createOneUser("wangwu", "wangwu", "wangwu@qq.com", "salt3");
System.out.println(objs);
}
@Override
@Test(dependsOnMethods = "testCreate")
public void testUpdate() {
}
@Override
@Test(dependsOnMethods = "testUpdate")
public void testFind() {
for (User u : objs) {
Assert.assertNotNull(userService.find(u.getId()));
}
for (User u : objs) {
Assert.assertNotNull(userService.findByUsername(u.getUsername()));
}
}
@Override
@Test(dependsOnMethods = "testFind")
public void testDelete() {
//将用户分成几部分,每个部分采用不同的方法删除
int mid = objs.size() / 2;
for (int i = objs.size() - 1; i > mid; i--) {
boolean flag = userService.remove(objs.get(i).getId());
Assert.assertEquals(flag, true);
}
for (int i = mid; i >= 0; i--) {
boolean flag = userService.remove(objs.get(i).getUsername());
Assert.assertEquals(flag, true);
}
//对列表(内存)中的用户去查询数据库
for (User user : objs) {
Assert.assertNull(userService.find(user.getId()));
}
}
private void createOneUser(String username, String password, String email, String salt) {
User.UserBuilder builder = new User.UserBuilder();
builder = builder.username(username).password(password).email(email).salt(salt);
User user = builder.build();
userService.create(user);
Assert.assertNotNull(user);
objs.add(user);
}
基类
public abstract class TestNGBase<T> extends Arquillian {
protected List<T> objs = new ArrayList<T>();
protected T obj = null;
/* @Deployment
public static JavaArchive createDeployment() {
return DeploymentSingleton.getInstance();
}
*/
public abstract void checked();
public abstract void testCreate();
public abstract void testUpdate();
public abstract void testFind();
public abstract void testDelete();
}
报错:
(..)stCreate(testng.dbtest.testng.dbtest.security.UrlRuleServiceTest):
(..)stCreate(testng.dbtest.testng.dbtest.security.UserServiceTest):
arquillianAfterClass(testng.dbtest.testng.dbtest.security.UserRoleRelationTest
): Singleton is not set. Is your Thread.currentThread().getContextClassLoader()
set correctly?
arquillianAfterClass(testng.dbtest.bayer.AuditServiceTest): Singleton is not s
et. Is your Thread.currentThread().getContextClassLoader() set correctly?
arquillianAfterClass(testng.dbtest.bayer.CallRouteServiceTest): Singleton is n
ot set. Is your Thread.currentThread().getContextClassLoader() set correctly?
arquillianAfterClass(testng.dbtest.bayer.DrugStoreServiceTest): Singleton is n
ot set. Is your Thread.currentThread().getContextClassLoader() set correctly?
arquillianAfterClass(testng.dbtest.testng.dbtest.security.PermissionServiceTes
t): Singleton is not set. Is your Thread.currentThread().getContextClassLoader()
set correctly?
arquillianAfterClass(testng.dbtest.testng.dbtest.security.RoleServiceTest): Si
ngleton is not set. Is your Thread.currentThread().getContextClassLoader() set c
orrectly?
arquillianAfterClass(testng.dbtest.bayer.StaffUserServiceTest): Singleton is n
ot set. Is your Thread.currentThread().getContextClassLoader() set correctly?
arquillianAfterClass(testng.dbtest.testng.dbtest.security.UrlRuleServiceTest):
Singleton is not set. Is your Thread.currentThread().getContextClassLoader() se
t correctly?
arquillianAfterClass(testng.dbtest.testng.dbtest.security.UserServiceTest): Si
ngleton is not set. Is your Thread.currentThread().getContextClassLoader() set c
orrectly?
尝试过将@Deployment注释的方法中的JavaArchive改为单例、使用不同的JavaArchive(通过@Deployment name属性),均无效