Tôi viết các bài kiểm tra JUnit cho một số Bộ điều khiển MVC Spring. Việc khởi tạo kiểm tra JUnit là phổ biến cho tất cả các kiểm tra Bộ điều khiển của tôi, vì vậy tôi muốn tạo một lớp trừu tượng để thực hiện việc khởi tạo này.Làm thế nào để có được lớp của một trường kiểu T?
Vì vậy, tôi đã tạo ra đoạn mã sau:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:spring/applicationContext-test.xml", "classpath*:spring/spring-mvc-test.xml" })
@Transactional
public abstract class AbstractSpringMVCControllerTest<T> {
@Autowired
protected ApplicationContext applicationContext;
protected MockHttpServletRequest request;
protected MockHttpServletResponse response;
protected HandlerAdapter handlerAdapter;
protected T controller;
@SuppressWarnings("unchecked")
@Before
public void initContext() throws SecurityException, NoSuchFieldException {
request = new MockHttpServletRequest();
response = new MockHttpServletResponse();
handlerAdapter = applicationContext.getBean(AnnotationMethodHandlerAdapter.class);
// Does not work, the problem is here...
controller = applicationContext.getBean(T);
}
}
Ý tưởng là để tạo ra, đối với mỗi bộ điều khiển Tôi muốn thử nghiệm một lớp học thử nghiệm JUnit kéo dài AbstractSpringMVCControllerTest
tôi. Loại được đưa ra trong tuyên bố extends
là lớp của Bộ điều khiển.
Ví dụ, nếu tôi muốn kiểm tra tôi AccountController
, tôi sẽ tạo ra lớp AccountControllerTest
như thế:
public class AccountControllerTest extends AbstractSpringMVCControllerTest<AccountController> {
@Test
public void list_accounts() throws Exception {
request.setRequestURI("/account/list.html");
ModelAndView mav = handlerAdapter.handle(request, response, controller);
...
}
}
Vấn đề của tôi nằm ở dòng cuối cùng của phương pháp initContext()
của lớp trừu tượng. Lớp trừu tượng này khai báo đối tượng controller
làm đối tượng T
, nhưng làm cách nào để có thể nói đến ngữ cảnh ứng dụng mùa xuân trả lại bean loại T
?
Tôi đã thử một cái gì đó như thế:
Class<?> controllerClass = this.getClass().getSuperclass().getDeclaredField("controller").getType();
controller = (T) applicationContext.getBean(controllerClass);
nhưng controllerClass
trả về lớp java.lang.Object.class
, không AccountController.class
.
Tất nhiên, tôi có thể tạo phương thức public abstract Class<?> getControllerClass();
, sẽ bị xóa bởi từng lớp kiểm tra JUnit Controller, nhưng tôi muốn tránh giải pháp này.
Vì vậy, có ý tưởng nào không?
Nếu bạn có ý tưởng tốt hơn cho tiêu đề câu hỏi, đừng ngần ngại :) – romaintaz
Chào mừng bạn đến với loại cơn ác mộng xóa được loại java. –
Không thể. Bản sao của [Nhận tên loại cho tham số chung của lớp chung chung] (http://stackoverflow.com/questions/6624113/get-type-name-for-generic-parameter-of-generic-class) –