我试图在我的spring控制器中为一个方法编写JUnit测试,但我似乎无法正确测试。在我测试时,似乎无法在控制器中自动连接数据库连接。
控制器
@Controller
public class PollController {
@Autowired
private PollRepository pollrepo;
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public String getPoll(@PathVariable String id, Model model) {
try {
Poll poll = pollrepo.findById(id);
if(poll == null) throw new Exception("Poll not found");
model.addAttribute("poll", poll);
return "vote";
} catch (Exception e) {
return "redirect:/errorpage";
}
}
}
和JUnit测试类
public class PollControllerTest {
public PollControllerTest() {
}
@BeforeClass
public static void setUpClass() {
}
@AfterClass
public static void tearDownClass() {
}
@Before
public void setUp() {
}
@After
public void tearDown() {
}
@Test
public void testGetPoll() {
System.out.println("getPoll");
String id = "5856ca5f4d0e2e1d10ba52c6";
Model model = new BindingAwareModelMap();
PollController instance = new PollController();
String expResult = "vote";
String result = instance.getPoll(id, model);
assertEquals(expResult, result);
}
}
我在这里错过了什么吗?
答案 0 :(得分:1)
它不会autowire
数据库连接,因为controller
中的junit
实例不受spring容器管理。
您已使用关键字PollController
创建了new
的实例,因此它不是Spring托管bean。
PollController instance = new PollController();
我建议使用@RunWith(SpringJUnit4ClassRunner.class)
注释您的测试类,并为测试注入控制器,
@RunWith(SpringJUnit4ClassRunner.class)
class PollControllerTest {
//Object under test
@Autowired
PollController instance;
答案 1 :(得分:0)
是。 pollrepo
是外部依赖项,因此您需要在测试类中对其进行模拟。请参考以下代码。
class PollControllerTest {
//Object under test
PollController instance;
@Mock
private PollRepository pollrepo;
@Before
public void setUp() {
instance = new PollController();
ReflectionTestUtils.setField(instance, "pollrepo", pollrepo);
}
//Tests goes here
}