2017-03-10 23 views
0

這是我第二次嘗試使用MyBatis創建集成測試。我嘗試了很多東西,但似乎沒有解決這個問題的方法。希望你們能幫助我。如何使用Arquillian(PART2)模擬MyBatis映射器接口?

In my previous question我試着寫一個集成測試來檢查我的rest API的輸出。其中的場景如下:rest API調用注入的EJB,它使用MyBatis執行一些SQL:rest api> ejb> mybatis。遺憾的是我沒能既不注入,也不是模擬的MyBatis映射器接口,所以我的測試不工作:(

現在我創造了另一個測試場景,但我在相同的情況下結束了 現在我的情況是瘋狂容易。我。有注入MyBatis的映射器的EJB,我想用的Arquillian嵌入式Glassfish的/似鯖水狼牙魚服務器中測試

這是我的例外:

org.glassfish.deployment.common.DeploymentException: CDI deployment failure:WELD-001408: Unsatisfied dependencies for type AccountDao with qualifiers @Default 
    at injection point [BackedAnnotatedField] @Inject private a.b.c.AppleBean.accountDao 
    at a.b.c.AppleBean.accountDao(AppleBean.java:0) 

EJB:

@Stateless 
public class AppleBean { 
    @Inject 
    private AccountDao accountDao; 

    public String say() { 
     return "Apple"; 
    } 
} 

帳戶maper(DAO):

@Mapper 
public interface AccountDao { 

    @Select("SELECT * FROM account WHERE id = #{id}") 
    @Results({ 
      @Result(property = "email", column = "email", javaType = String.class), 
      @Result(property = "firstName", column = "first_name", javaType = String.class), 
      @Result(property = "lastName", column = "last_name", javaType = String.class), 
    }) 
    Account findById(@Param("id") Long id); 
} 

我的測試類:

@RunWith(Arquillian.class) 
public class AppleBeanTest { 
    @EJB 
    private AppleBean bean; 

    @Deployment 
    public static WebArchive createDeployment() { 
     return ShrinkWrap 
       .createFromZipFile(WebArchive.class, new File("target/war-demo-test-1.0.war")) 
       .addPackages(true, "a.b"); 
    } 

    @Test 
    public void say() throws Exception { 
     assertNotNull(bean); 
     System.out.println(bean.say()); 
    } 
} 

如果我評論在AppleBeanTest兩行刪除refelence到MyBatis的映射器那麼我的測試工作正常。

I uploaded the source code to github as well.


SOLUTION

下面的類是從我的測試遺漏。 @blackwizard感謝你讓我走向正確的方向。

SessionFactoryProducer.java

@ApplicationScoped 
public class SessionFactoryProducer { 
    @ApplicationScoped 
    @Produces 
    @SessionFactoryProvider 
    public SqlSessionFactory produce() throws Exception { 
     SqlSessionFactory sessionFactory; 
     try (Reader reader = Resources.getResourceAsReader("mybatis.xml")) { 
      sessionFactory = new SqlSessionFactoryBuilder().build(reader); 
     } 
     // create sample table 
     //createTable(sessionFactory); 

     return sessionFactory; 
    } 

    private void createTable(final SqlSessionFactory manager) throws Exception { 
     try (SqlSession session = manager.openSession()) { 
      LOGGER.info("-> Initializing database..."); 
      Connection conn = session.getConnection(); 
      Reader reader = Resources.getResourceAsReader("create-table-postgresql.sql"); 
      ScriptRunner runner = new ScriptRunner(conn); 
      runner.runScript(reader); 
      reader.close(); 
      LOGGER.info("=> Database has been initialized properly."); 
     } catch (Exception ex) { 
      LOGGER.error("Error executing SQL Script...", ex); 
     } 
    } 
} 

Git項目被更新。

+0

如果您嘗試在非測試環境中運行它,它會工作嗎? – blackwizard

+0

是的,如果我將戰爭部署到payara服務器,它可以工作。 – zappee

回答

1

在這裏和現在,我沒有資源克隆和運行您的項目來確認我會說什麼。但我會在星期一,如果有必要,在此期間,以下可能是一條軌道:

我認爲這是行不通的,因爲缺少一些非常重要的東西:SqlSessionFactory。在第一段

mybatis-cdi doc狀態:

而SqlSessionFactory是任何的MyBatis豆的來源,以便首先你 需要創建一個(至少)而讓容器知道它 存在。

事實上,如果沒有Session,沒有理由獲得Mapper實例。如果@Mapper註釋足夠了,它只能提供一個空殼,因爲沒有鏈接到任何底層數據源。 然後如果沒有映射器,它就不能被注入到EJB中,這就是Weld抱怨的事情。

部署成功時,是否與@Inject private AccountDao accountDao?我不明白爲什麼Weld會允許沒有任何注射。但是如果是這樣,請檢查accountDao值(調試中斷點或日誌)。

+0

SQLSessionFactory從測試中丟失。萬分感謝。 – zappee