2016-10-27 10 views
1

ユニットテストを作成しようとしている既存のアプリケーションがあります。本当の 'サービス'レイヤはありません。それはコントローラ - >リポジトリ - >データベースに行き、エンドポイントはコントローラのアノテーションによって定義されます。私はSpring Boot 1.3.8(1.4ではなく)を使用しています。Springテスト - モックコントローラ付きテストエンドポイント

私がしたいことは、私が確認できるモックコレクションを返すようにコントローラをモックすることです。何が起こっているのかアプリはブートストラップされており、実際のデータはシードされています。私がエンドポイントを呼び出すと、実際のアプリケーションデータが返されます。だから、私は2つの問題があるように思えます:私はユニットテストでは実行したくないデータセットアップと設定を行い、第2に、モックコントローラは無視されています。おそらく関連しているでしょう。どんな助けもありがとうございます。ありがとう。あなたは、リポジトリ上の方法を模擬したいコレクションを持って、コントローラ内部で何らかの処理を行う、修正コレクションを返すことができるように

@Autowired 
    private WebApplicationContext context; 
    private MockMvc mockMvc; 

    @Mock 
    private ApplicationController applicationController = new ApplicationController(); 

    @Before 
    public void setup() { 
     MockitoAnnotations.initMocks(this); 
     mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); 
    } 

    @Test 
    public void contextLoads() {} 

    @Test 
    public void testEndPoints() throws Exception { 
     Application testApp = TestUtils.generateApplication(); 
     Mockito.when(applicationController.getApplications()).thenReturn(Arrays.asList(testApp)); 
     log.info("Verifying applications endpoint is up and running."); 

     mockMvc.perform(get("/applications/")).andExpect(status().isOk()) 
       .andDo(print()) 
       .andExpect(content().contentType(TestUtils.APPLICATION_JSON_UTF8)) 
       .andExpect(jsonPath("$.[0].name",is("my_name"))); 
    } 

答えて

0

は、通常、このモックリポジトリのような場合は、コントローラに注入されます。次に、あなたのユニットテストは、この処理されたコレクションが期待通りのものであることを確認します。

@Autowired 
private ApplicationRepository applicationRepository; 
@Autowired 
private WebApplicationContext context; 
private MockMvc mockMvc; 

@InjectMocks 
private ApplicationController applicationController; 

@Before 
public void setup() { 
    MockitoAnnotations.initMocks(this); 
    mockMvc = MockMvcBuilders.webAppContextSetup(context).build(); 

    when(applicationRepository.findAllByIds(anyListOf(Long.class)) 
     .thenReturn(<the collection you want to be processed by controller>); 
} 
+1

ありがとう:よう

何か。私は実際にあなたが示したものとほぼ同じように見える 'ServiceTests'のクラスを持っています。最初から、コントローラーが委任してからビジネスロジックを持ち、データのリポジトリを呼び出すサービスレイヤーを作成しました。私がしたいのは、単純にダミーデータが返されたエンドポイントを呼び出してテストし、いくつかのJSON値とhttpステータスをチェックすることです。私がコントローラーをモックしないと、コントローラーメソッドにはスタッブできないプライベートメソッドがいくつかあるので問題があります。 – Mike

+0

あなたがテストしようとしていることは私にはっきりとは分かりません。私はあなたのコントローラーをテストしたいと思っていました。しかし、あなたがただそれを嘲笑してすぐにデータを返すのであれば、それでは何をテストしていますか? – borowis

関連する問題