3

Spring MVC テストを実行しようとしていますが、この例外が引き続き発生します。

org.springframework.web.util.NestedServletException: リクエストの処理に失敗しました。ネストされた例外は java.lang.NullPointerException です

自動配線された依存関係のために例外が発生しています。

    @Autowired
    private AccountService accountService;

テストに注入されていません(テスト外では正常に動作します)。

誰でもこれで私を助けることができますか?これが私のコードです:

//AccountControllerITest クラス

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MockServletContext.class)
@WebAppConfiguration
public class AccountControllerITest {

private MockMvc mvc;

ObjectMapper om;

@Before
public void setUp() throws Exception {
    mvc = MockMvcBuilders.standaloneSetup(new AccountController()).build();
}

@Test
public void getAccounts() throws Exception {
    MvcResult mvcResult =     mvc.perform(MockMvcRequestBuilders.get("/api/accounts"))
            .andExpect(status().isOk())
            .andReturn();
}    
}

}

//アカウントコントローラー

@RestController
@RequestMapping("/api/accounts")
public class AccountController {

@Autowired
private AccountService accountService;

@RequestMapping(method = RequestMethod.GET)
public ResponseEntity<Set<AccountInfo>> getAccounts(@RequestParam(value = "firstName", required = false) String firstName,
                                                    @RequestParam(value = "surName", required = false)  String surName) {
    Set<AccountInfo> accounts = accountService.getAccounts(firstName, surName);
    return new ResponseEntity<>(accounts, HttpStatus.OK);
}

}

助けてくれてありがとう!

4

2 に答える 2

1

スタンドアロン セットアップを使用しているため: mvc = MockMvcBuilders.standaloneSetup(new AccountController()).build();. を介してコントローラーを作成する場合、Spring はインスタンスの作成と配線を制御しないためnew AccountController()、注入する機会がありません。accountService

次の 2 つのオプションがあります。

  1. テストを単体テストに切り替え、SpringJUnit4ClassRunnernorMockServletContextをまったく使用しないでください。@InjectMocksprivate を注入するために使用できますaccountService

    public class AccountControllerITest {
    
        private MockMvc mvc;
    
        ObjectMapper om;
    
        @Mock
        private AccountController accountController = new AccountController();
    
        @InjectMocks
        private AccountService accountService = new Mockito.mock(AccountService.class);
    
        @Before
        public void setUp() throws Exception {
            mvc = MockMvcBuilders.standaloneSetup(accountController).build();
        }
    

    コントローラーに適用できる機能強化もあります。フィールド注入をコンストラクター注入に置き換えるとaccountService、テストでコンストラクターを介してコントローラーに渡すことができます。この方法では、まったく使用する必要はありません@InjectMocks

  2. webAppContext セットアップを使用します。

    @Autowired
    private WebApplicationContext webApplicationContext;
    
    @BeforeMethod
    public void init() {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }
    
于 2015-09-02T08:42:35.390 に答える