2016-11-22 8 views
0

私が使用していながら:Netbeansの、Glassfishの、MockitoモッキングEntityManagerのEJBクラスのテストは

私は、データベースを使用して対話するメソッドをテストしようとしているの問題に遭遇したのは初めてのためのJava EEでの作業中entitymanager。

以下のコードスニペットでは、エンティティマネージャをモックアウトしようとしていますので、dbのやりとりは正確にテストされず、このテストは正常です。しかし、私はUsersControllerを注入することに夢中になっています。なぜなら、注入されたEntityManagerは常にnullです。 EntityManagerを嘲笑して、残りのメソッドをテストできるようにしたいと思います。

以下は、dbとやり取りするクラスです。これはサンプルメソッドであることに注意してください。これは本番用ではありません。

@Stateless 
public class UsersController { 
    @PersistenceContext() 
    EntityManager em; 

    public User getOne() { 
     em.getEntityManagerFactory().getCache().evictAll(); 
     User theUser = null; 
     try { 
      Query q = em.createNamedQuery("User.findAll"); 
      Collection<User> entities = q.getResultList(); 
      theUser = Iterables.get(entities, 1); 
     } 
     catch(NoResultException e){} 
     em.flush(); 
     return theUser; 
    }; 
} 

このメソッドをテストするテストファイル。 UsersControllerモックはEntityManagerを作成されるたびに

@RunWith(MockitoJUnitRunner.class) 
public class UsersControllerTest { 

    @Mock 
    private UsersController usersController; 
    @Mock 
    private EntityManager entityManagerMock; 

    private Collection<User> mockUsersDbCollection = //... 

    @BeforeClass 
    public void setUpClass() { 

     when(entityManagerMock.createNamedQuery("User.findAll")).thenReturn(mockUsersDbCollection); 
    } 

    @Test 
    public void findOneTest(){ 
     User mockUserDbEntry = new User("1", "pa$$word", "salt", "user1", "[email protected]", false); 

     User returnedUser = null; 
     returnedUser = usersController.getOne(); 

     assertEquals(returnedUser.getId(), "1"); 
    } 
} 

は、どのように私はそれが動作しますので、EntityManagerMockを注入することができ、常にnull原因の問題でしょうか?

答えて

0

あなたはここにいくつかの問題を持っている:あなたはあなたのUsersControllerは、したがって、それは嘲笑するべきではありませんテストしている

  • 。あなたはMockitoは、あなたのモックエンティティマネージャを注入したいので、むしろ、あなたはそれに@InjectMocksのアノテーションを使用する必要があります

  • @BeforeClass注釈のみ順番にのみ静的インスタンス変数にアクセスすることができます静的メソッドに適用した場合に動作します。この例では、私はあなただけで、あなたのテストは何かを見なければならない、あなたが貼り付けられたコードでも最後に

をコンパイルしてはならないモックQueryオブジェクトを返すために

  • あなたentityManagerMock.createNamedQueryニーズ@Before注釈が必要だと思いますlike:

    @RunWith(MockitoJUnitRunner.class) 
    public class UsersControllerTest { 
    
        @InjectMocks 
        private UsersController usersController; 
    
        @Mock 
        private EntityManager entityManagerMock; 
    
        @Mock 
        private EntityManagerFactory entityManagerFactory; 
    
        @Mock 
        private Cache emfCache; 
    
        @Mock 
        private Query findAllQuery; 
    
        private List<User> mockUsersDbCollection = //... 
    
        @Before 
        public void setUp() { 
         when(entityManagerFactory.getCache()) 
          .thenReturn(emfCache); 
         when(entityManagerMock.getEntityManagerFactory()) 
          .thenReturn(entityManagerFactory); 
         when(entityManagerMock.createNamedQuery("User.findAll")) 
          .thenReturn(findAllQuery); 
         when(findAllQuery.getResultList()) 
          .thenReturn(mockUsersDbCollection); 
        } 
    
        @Test 
        public void findOneTest(){ 
         mockUsersDbCollection.add(new User("1", "pa$$word", "salt", "user1", "[email protected]", false)); 
    
         User returnedUser = usersController.getOne(); 
    
         assertEquals(returnedUser.getId(), "1"); 
        } 
    } 
    
  • +0

    フィードバックをいただきありがとうございますが、まだ問題が発生しています。 'em.getEntityManagerFactory()。getCache()。evictAll();'を呼び出すときにnullポインタ例外がありますが、entityManagerが擬似的に外されていると思いましたか? –

    +0

    うん、その行を逃した。すべてのモックのデフォルトの動作は何もせず、必要に応じて 'null'または' 0'を返すことです。 –

    関連する問題