JSONを消費して生成する非常にシンプルなRESTfulコントローラーがあります。このコントローラーをオフラインでテストする必要があります。つまり、サーバーもデータベースも実行されていません。そして、私は解決策を見つけることができなかったので気が狂います。私の最初のテストケースには次のものが含まれます。
- REST URI、つまりGET、POST、PUT、DELETEをテストします-送信されたデータに対して返されたデータをアサートできる必要があります。
- アサートはJSONデータをテストします
私は次のURIを持っています:
- /pcusers-すべてのユーザーを返します
- / pcusers/{id}-特定のユーザーを返します
- / pcusers / create/{pcuser}-ユーザーをdbに追加します
- / pcusers / update/{pcuser}-ユーザーを更新します
- / pcusers / delete/{id}-ユーザーの削除
注:これは一般的なMVCアプリケーションではありません。ビューがありません。JSONを吐き出し、JSON形式のデータを消費する純粋なRESTコントローラーがあります。
誰かが私を正しい方向に導くことができれば本当にありがたいです。
私のコードがどのように見えるかを明確にするために:
@Controller
@RequestMapping("/pcusers")
public class PcUserController {
protected static Logger logger = Logger.getLogger(PcUserController.class);
@Resource(name = "pcUserService")
private PcUserService pcUserService;
@RequestMapping(value = "", method = RequestMethod.GET, produces = "application/json")
@ResponseBody
public List<PcUser> readAll() {
logger.debug("Delegating to service to return all PcUsers");
return pcUserService.readAll();
}
@RequestMapping(value = "/{id}", method = RequestMethod.GET, consumes = "application/json", produces = "application/json")
@ResponseBody
public PcUser read(@PathVariable String id) {
logger.debug("Delegating to service to return PcUser " + id);
return pcUserService.read(id);
}
@RequestMapping(value = "/create/{pcUser}", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
@ResponseBody
public boolean create(@PathVariable PcUser pcUser) {
logger.debug("Delegating to service to create new PcUser");
return pcUserService.create(pcUser);
}
@RequestMapping(value = "/update/{pcUser}", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
@ResponseBody
public boolean update(@PathVariable PcUser pcUser) {
logger.debug("Delegating to service to update existing PcUser");
return pcUserService.update(pcUser);
}
@RequestMapping(value = "/delete/{id}", method = RequestMethod.POST, consumes = "application/json", produces = "application/json")
@ResponseBody
public boolean delete(@PathVariable String id) {
logger.debug("Delegating to service to delete existing PcUser");
return pcUserService.delete(id);
}
}
更新(2012年2月5日): いくつかの調査の後、spring-test-mvcと呼ばれるSpringフレームワークに出くわしました。それは非常に有望に見えます、そして私はこれで良いスタートを切ることができました。しかし今、私は新しい問題を抱えています。「/pcusers/ {id}」にGETリクエストを送信すると、そのマッピングの処理を担当するreadメソッドにコントロールが渡されます。そのメソッドの中に、読み取りを行うpcUserServiceがあります。ここで、問題は、このテストを実行すると、実際のコントローラー内のpcUserServiceインスタンスがNULLになることです。したがって、NULLオブジェクトでreadを呼び出すことができないため、クラッシュすることになります。
PcUserControllerTestコードは次のとおりです。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:/applicationContextTest.xml")
public class PcUserControllerTest {
@Autowired
PcUserService pcUserService;
@Autowired
PcUserController pcUserController;
PcUser pcUser;
@Before
public void setUp() throws Exception {
pcUser = new PcUser("John", "Li", "Weasley", "john", "john", new DateTime());
pcUserService.create(pcUser);
}
public void tearDown() throws Exception {
pcUserService.delete(pcUser.getId());
}
@Test
public void shouldGetPcUser() throws Exception {
standaloneSetup(pcUserController)
.build()
.perform(get("/pcusers/" + pcUser.getId()).accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk());
}
}