2017-11-07 6 views
3
で仕事を@GetMapping

HelloController.java春MockMvc

@RestController 
class HelloController { 

@GetMapping(value = "{id}/hello") 
public ModelAndView listAPI(@PathVariable("id") String profileId) { 
    ModelAndView mav = new ModelAndView(); 
    return mav; 
}  
} 

HelloControllerTest.java

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration(classes = HelloConfigTest.class) 
class HelloControllerTest { 

@Inject 
private WebApplicationContext webApplicationContext; 

@Inject 
private Foo mockFoo 

@InjectMocks 
HelloController helloController; 

private MockMvc mockMvc; 

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

@Test 
public void testHello() throws Exception { 
    mockMvc.perform(
     get("/{id}/campaigns", "id1")) 
     .andExpect(status().isOk())); 
    } 
} 

    // I have another test that directly calls the controller method. 
// So I need @InjectMocks to get an instance of the controller 

@Test 
public void test2() { 

    when(mockFoo.getX()).thenReturn(true); 
    helloController.saveAPI(); 
} 

HelloConfigTest.java

@Configuration 
@ComponentScan("com.test.controller") 
class HelloConfigTest { 

@Bean 
public mockFoo() { 
    return Mockito.mock(Foo.class); 
    } 
} 

私はここで取得することを応答が404であり、Iは

200を期待しかし、それは動作し、Iは@GetMapping@RequestMapping(値を変更した場合、私は200を取得= "{ID} /こんにちは"、メソッド= RequestMethod.GET)

ここに何か不足していますか?

+0

「MockMvc」をどのように初期化していますか? –

+0

あなたのコード(および基本的な前提条件)はうまく動作します。 [mcve]を投稿してください。 –

+0

@SotiriosDelimanolis私は今テストクラスを更新しました。私はちょうどConfigファイルを含めていません – user3451476

答えて

2

あなたの設定は非常に裸の骨

@Configuration 
@ComponentScan("com.test.controller") 
class HelloConfigTest { 

であることが暗黙的または明示的に、任意のSpring MVCのインフラ豆を登録しません。

MockMvcが内部でを作成して@Controllerクラスをテストする場合、いくつかのデフォルトのSpring MVCインフラストラクチャタイプを延期する必要があります。これらのインフラストラクチャタイプのうち

が要求ハンドラオブジェクトとの間のマッピングを定義するオブジェクトによって実装されるHandlerMappingあります。

TestDispatcherSerletで使用されるデフォルトの実装では、DefaultAnnotationHandlerMapping@RequestMapping特にを探します(旧クラスが)、それは再帰的にメタアノテーション検索を行いませんです。したがって、@GetMapping注釈付きメソッドは見つからず、ハンドラとして登録されません。

が場合は、代わりに、あなたは暗黙的に注釈階層のため、この「再帰的」検索を行いんRequestMappingHandlerMappingを、登録されます@EnableWebMvc

@Configuration 
@ComponentScan("com.test.controller") 
@EnableWebMvc 
class HelloConfigTest { 

春を使用してアプリケーション・コンテキストを設定する(マージと呼ばれます)。 @GetMapping@RequestMappingでアノテーションされているので、注釈付きハンドラメソッドが見つけられて登録されます。 @InjectMocksとして


、フィールドによって参照されるインスタンスは、MockMvcオブジェクトによって実行される要求を処理するために使用されるものとは異なることに注意してください。前者はMockitoによって管理され、後者はSpringによって管理されます。

+0

ビンゴ!それはうまくいった。ありがとうございました! InjectMocksについて。そのコントローラメソッドを直接呼び出すテストは、Mockmvcを使用してテストする必要があります。その後、テストクラスからコントローラフィールドを削除できます。 – user3451476

+0

あなたの説明は真剣に**信じられない**です。 –

関連する問題