Spring数据自动连接数据库连接无法通过JUnit测试

时间:2016-12-19 01:02:45

标签: java spring spring-mvc junit spring-data

我试图在我的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);
    }
}

我在这里错过了什么吗?

2 个答案:

答案 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
}