2017-02-22 13 views
1

私は、注入のためのmockitoで簡単なユニットテストを設定しようとしています。このプロジェクトは、私の友人が彼のプロジェクトのために作っているテストの概念証明です。ユニットテストをMockitoでセットアップする

私が抱えている問題は、「Hello World」ではなく、私が呼び出しているメソッドからnullが返されることです。また私がデバッグするときには、という名前のクラスに入っています。このクラスは、IndexOutOfBoundsExpetionを引数として持つinterceptというメソッドを呼び出しています。

誰かが間違っていることを知っていますか?

DAO:

@Stateless 
public interface DAO { 
    public String helloWorld(); 
} 

DAOの実装:

@Stateless 
public class DAOImpl implements DAO{ 

    public String helloWorld() { 
     return "Hello World"; 
    } 
} 

サービス:

@Stateless 
public class Service { 
    @Inject 
    private DAO dao; 

    public String helloWorld() { 
     return dao.helloWorld(); 
    } 
} 

テスト:

public class RandomTest { 

    @InjectMocks 
    Service service = new Service(); 

    @Mock 
    DAO dao; 

    @Before 
    public void init(){ 
     MockitoAnnotations.initMocks(this); 
    } 

    @Test 
    public void testTest() { 
     assertEquals("Hello World", service.helloWorld()); 
    } 
} 

ちなみに、私は(それが重要かどうかわからないが、とにかくそれを言う)のIntelliJを使用しています。

+1

まず、 '@InjectMocks'はクラスのインスタンスを作成し、 '@Mock'(または '@Spy')アノテーションで作成されたモックをこのインスタンスに挿入します。したがって、beforeメソッドを削除しようとします。第2に、 '@mock'クラスはクラスを拡張し、メソッドを実装しないクラスで、(...)でスタブする必要があるメソッドの動作を指定します。thenReturn()voidメソッドをスタブしている場合は、 '@Spy'を使用してください。最後に、Testクラスでランナー '@RunWith(MockitoJUnitRunner.class)'アノテーションを使用する必要があります。 – LazerBanana

+0

@ Krystian_K Yoav Gur(彼が削除したばかり)のソリューションと組み合わせたソリューションは、ありがとう! –

+0

@ Krystian_Kあなたのコメントを回答にすると、私はそれを受け入れる –

答えて

2

があるまず、'@InjectMocks'は、クラスのインスタンスを作成し、注入'@Mock'(または'@Spy')アノテーションで注釈が付けられているので、@Beforeメソッドを削除しようとするか、手動で注入しますが、を削除してください注釈。

第二に、'@Mock'クラスがあなたのクラスを拡張するクラスであり、あなたが

when(...).thenReturn() 

場合、または使用して、それをスタブする必要があるメソッドの動作を設定するには、(nullを返す)任意のメソッドを実装していませんBDD

given(...).willReturn() 

あなたはvoidメソッドが'@Spy'を使用して試してみて、最後にあなたがJUnitテストrとMockitoを使用した場合のテストクラスにランナー'@RunWith(MockitoJUnitRunner.class)'アノテーションを使用する必要がスタブしている場合unner(これはデフォルトランナー)はMockitoについて何も知らない。

0

DAOクラスがあなたのServiceクラスでモックされているので、あなたはモックする戻りオブジェクトを指定する必要があります。

@Test 
public void testTest() { 
    when(dao.helloWorld()).thenReturn("Hello World") 
    assertEquals("Hello World", service.helloWorld()); 
} 

それとも、注入構築使用することができます。

@Stateless 
public class Service { 

    private DAO dao; 

    @Inject 
    public Service(DAO dao) { 
     this.dao = dao;   
    } 

    public String helloWorld() { 
     return dao.helloWorld(); 
    } 
} 

public class RandomTest { 

    Service service; 

    @Before 
    public void init(){ 
     service = new Service(new DAOImpl()); 
    } 

    @Test 
    public void testTest() { 
     assertEquals("Hello World", service.helloWorld()); 
    } 
} 

や反射を、春の例するためのユーティリティクラスがhttp://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/util/ReflectionTestUtils.html

関連する問題