当前位置: 首页 > 知识库问答 >
问题:

mockitoSpring靴

昌勇锐
2023-03-14

我需要用mocking道测试服务方法。我还需要测试道方法来知道一个方法是否正确工作。但是我不能将mockito与Spring引导集成。如果我使用MockitoJUnitRunner第一次测试工作,如果我使用SpringJUnit4ClassRunner第二次测试工作。我也尝试使用@MockBean代替@Mock,但是它也不工作。

//SpringJUnit4ClassRunner
//MockitoJUnitRunner
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class BookServiceTests {

    @Mock
    private BookDao bookDao;
    @Autowired
    private BookDao bookDao2;
    private List<Book> listOfBooks;

    @InjectMocks
    @Autowired
    private BookService bookService;

    @PersistenceContext
    private EntityManager entityManager;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testGetMostPopularBooksInService() {
        fillListOfBooks();
        when(bookDao.selectMostPopularBooks(3, 3)).thenReturn(listOfBooks);
        assertEquals(3, bookService.getMostPopularBooks(0, 3).size());
    }

    @Test
    @Transactional
    public void testSelectMostPopularBooks() {
        fillDBByBooks();
        List<Book> listOfPopularBooks = bookDao2.selectMostPopularBooks(0, 3);
        assertEquals(3, listOfPopularBooks.size());
        assertEquals("Марсианинн", listOfPopularBooks.get(0).getName());
    }

    private void fillListOfBooks() {
        Writer writer = new Writer(3, "Джек", "Лондон", "...", null);
        listOfBooks = new ArrayList<>();
        listOfBooks.add(new Book(6, "Зов предков", 1990, writer, "...",
                10, new HashSet<>(Arrays.asList(new Genre(1, "Психология")))));
        listOfBooks.add(new Book(8, "Зов предков", 1990, writer, "...",
                25, new HashSet<>(Arrays.asList(new Genre(1, "Психология")))));
        listOfBooks.add(new Book(10, "Зов предков", 1990, writer, "...",
                35, new HashSet<>(Arrays.asList(new Genre(1, "Психология")))));
    }

    private void fillDBByBooks() {
        Writer writer = new Writer(28, null, null, null, null);
        entityManager.persist(new Book(0, "Огонь и вода", 1990, writer, "...",
                105, new HashSet<>(Arrays.asList(new Genre(1, "Психология")))));
        entityManager.persist(new Book(0, "Солнце", 1990, writer, "...",
                150, new HashSet<>(Arrays.asList(new Genre(1, "Психология")))));
        entityManager.persist(new Book(0, "Космос", 1990, writer, "...",
                200, new HashSet<>(Arrays.asList(new Genre(1, "Психология")))));
        entityManager.persist(new Book(0, "Марсианин", 1990, writer, "...",
                225, new HashSet<>(Arrays.asList(new Genre(1, "Психология")))));
    }

}

共有2个答案

公冶昆杰
2023-03-14

实际上,ContextConfiguration注释并不是必须的,因为SpringBootTest将尝试自己查找现有的配置(然而,据我所知,如果有超过1个上下文配置可用,它将抛出一个异常)。

而且,使用模拟豆和自动配发的也没有问题,下面是一个例子:

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

    @Autowire
    private RealBean realBean;

    @MockBean
    private BeanYouWantToMock mockedBean;

    @Override
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks( this );
    }

然而,不要使用@InjectMocks注释,@MockBean意味着你正在用模拟的bean替换上下文中的真实bean,所以你不需要在某个地方注入它,spring上下文会为你做这件事。

陶寒
2023-03-14

首先,您的上下文配置注释在测试类中丢失了,所以您在那里没有任何Spring容器支持或自动装配。它应该是这样的:

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(
    classes = {MyApplicationConfig.class}
)

public class MyTestClass

其次,我不会在同一个测试类中混合模拟bean和自动连线bean。我甚至不确定这是否可能。我建议你把考试分为两类。一个类有真正的DAO和可用的上下文配置,另一个类只有纯模拟。

 类似资料:
  • 问题内容: 我有一个简单的服务在调用数据库的端口上暴露的容器中运行。 当我击中我回来 当我直接在浏览器中点击它时,它的工作就很好。但是,当我尝试使用它时,我就变得正常了。 这是我的春季启动服务: 这是我的: 但我仍然收到此错误: 我曾尝试这种通过添加到方法和我在类级别都试过了。我也查看了此内容,因为我在port上运行了UI 。但是那个联系不是特定于春天的。 编辑 添加我的请求标头: 网络标签(Ch

  • 我正在使用keycloak来保护我的rest服务。我引用的是这里给出的教程。我创建了其余部分和前端。现在,当我在后端添加keycloak时,当我的前端调用api时,我会得到CORS错误。 我调用的示例REST API 前端keycloak.json属性包括 我得到的CORS错误

  • 一定有一些方法来使用执行器的endpoint,但我不能电线他们。 我有一个JavaConfig类,如下所示 但此配置在部署过程中引发错误。 没有Spring Boot应用程序,这种布线可以完成吗?

  • 我想在Spring引导中使用hibernate拦截器,以便在提交事务后使用方法执行某些操作。 我遵循如何在Spring Boot中使用Spring管理的Hibernate拦截器进行配置(我只是在中添加) 拦截器可以工作,但当我尝试在方法中获取事务状态时,仍然存在问题,它总是(我希望它可以): 我试着调试它,发现在调用之前, 在扩展了,方法调用方法,该方法调用以设置事务状态: 有人能帮我解决这个问题

  • 有一个简单的代理: 预过滤器: 和属性: 总的来说,一切正常。 但是代理发送的网页具有以下链接 必须采用如下形式: 如何配置服务器以发送正确的链接? 案例: 1.直接从Internet访问myserver时,例如: 服务器发送带有如下链接的页面: 2.从Internet访问代理时,如: 代理服务器发送带有以下链接的页面:

  • 在我的spring boot应用程序中,我有一个组件,它有一个方法,在下面的无限循环中运行一些作业,实际上它检查数据库中的一些数据: