首页 > 有人用过Arquillian做CDI测试,讨教个问题。

有人用过Arquillian做CDI测试,讨教个问题。

在项目测试中遇到个问题。
项目使用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属性),均无效

【热门文章】
【热门文章】