1

私は夢中になり、さまざまなテストランナーとテスト用の可能な注釈のすべての可能な組み合わせを試しました。私の必要性の最も近い解決策は次のとおりです。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {MyApplication.class})
@WebAppConfiguration
public class MyControllerTest {

    MockMvc mockMvc;

    // My DAO is an interface extending JpaRepository
    @Mock
    MyDAO myDAO;

    @Autowired
    WebApplicationContext webApplicationContext;

    @Before
    public void setUp() throws Exception {
        List<MyItem> myItems = new ArrayList(){{
            // Items init ...
        }}
        Mockito.when(myDAO.findAll()).thenReturn(myItems);
        /* Other solution I tried with different annotations: 
        * given(myDAO.findAll()).willReturn(myItems);
        * this.mockMvc = MockMvcBuilders.standaloneSetup(myController).build();
        */
        this.mockMvc = webAppContextSetup(webApplicationContext).build();

    }

    @After
    public void tearDown() throws Exception {
//        Mockito.reset(myDAO);
    }

    @Test
    public void getItems() {
        String res = mockMvc.perform(get("/items"))/*.andExpect(status().isOk())*/.andReturn().getResponse().getContentAsString();
        assertThat(res, is("TODO : string representation of myItems ..."));
        assertNull(res); // For checking change in test functionning
    }
}

コントローラーメソッド、サービスメソッドでデバッグモードに入りますが、DAOタイプが表示されると、それはモックではなく、findAll()は常に空のArrayList()を返します。

Mockito.when(myDAO.findAll()).thenReturn(myItems);

私は例外を発生させていません。私のDAOは嘲笑されておらず、見つけたすべてのチュートにもかかわらず、どうすればよいかわかりません。私が見つけた私の必要性の最も近いチュートリアルは、Spring MVC テストを使用したこのユニットテストコントローラーでしたが、コントローラーをテストするためにコントローラーにモックサービスを注入したいため、十分ではありませんでした。コントローラーに注入された実際のサービスに挿入された DAO をモックしたい (コントローラ + サービスをテストします)。

テストモードでスプリングアプリケーションによってどのクラスをインスタンス化する必要があり、どのクラスをモックする必要があるかを指定するテストクラスの注釈を使用して、私はすでにそれを行ったようですが、「-_-.

あなたの助けが必要です、それは私を狂わせます!

どうもありがとうございました !!!

4

2 に答える 2