如何以正确的方式模拟CrudRepository?

时间:2017-12-10 12:40:49

标签: java spring-boot mocking

我是Spring的新手。我的GCGood类与CrudRepository一起保存到MySQL-DB。它工作正常。

现在我尝试编写JUnit-Test。当然,我不希望任何测试数据存在于我的数据库中。所以我写了我的测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class GCGoodTests {

    @MockBean
    private GCGoodRepository goodRepository;

    @Test
    public void getterSetterTest()
    {
        GCGood testDummy = new GCGod();
        testDummy.setAttribute("Muhaha");
        testDummy.setColor(Color.BLACK);
        testDummy.setName("Maka");
        testDummy = goodRepository.save(testDummy);
        Iterable<GCGood> testDummy2 = goodRepository.findAll();
        assertEquals(testDummy.getAttribute(), "Muhaha");
        assertEquals(testDummy.getColor(), Color.BLACK);
        assertEquals(testDummy.getName(), "Maka");
        assertNotNull(testDummy.getId());
        assert(testDummy.getId()>0);
        assertNotNull(testDummy2);
    }
}

Unfortuantelly&#34; testDummy = goodRepository.save(testDummy); &#34;和&#34; Iterable testDummy2 = goodRepository.findAll(); &#34;返回null,测试甚至没有完成。

如果我将@MockBean更改为@Autowire,一切正常。但是我的数据库中有不必要的data-shmodda。

那么,如何在没有data-shmodda的情况下实现校正测试?

2 个答案:

答案 0 :(得分:1)

虽然你已经注入了mocked-bean但是你实际上没有提到过必须被模拟的方法以及你在mocked bean上调用某个方法时的期望。你可以做的是,只需像这样编写@Before方法:

@Before
public void setup() {
        List<GCGood> gcgoods = Collections.emptyList();
        given(goodRepository.findAll()).willAnswer(gcgoods);
}

给定的()和willAnswer()位于BDDMockito中,您可以通过import static org.mockito.BDDMockito导入。*;

答案 1 :(得分:1)

看起来您想要进行集成测试。如果是这样,您应该使用@DataJpaTest注释,该注释可以在内存数据库中运行测试时为您创建环境。您可以在documentation找到更多信息。

这也取决于你想要测试的内容。如果存储库(GCGoodRepository)是您的测试目标,您应该@Autowired它并使用内存数据库中的一些来在隔离环境中测试它,如上所述。如果你测试一些依赖于某个存储库的服务(例如GCGoodRepository),你应该像@karthi提到的那样模拟这个存储库。