首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Junit4 Mockito UnfinishedVerificationException TransactionManager

Junit4 Mockito UnfinishedVerificationException TransactionManager
EN

Stack Overflow用户
提问于 2014-08-16 04:46:50
回答 1查看 1.6K关注 0票数 1

当我开始在一个基于FW4的Spring应用程序中对一些控制器方法进行单元测试时,我遇到了一个复杂的问题。

我的ApplicationConfig.java使用@Configuration和@EnableTransactionManagement(proxyTargetClass = true)和一个公共控制器方法进行注释,我创建该方法是为了保存一个简单实体类的新对象,该方法是具有以下ControllerTestClass的testet

代码语言:javascript
复制
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = {"classpath:/test-context.xml"})
@TransactionConfiguration(defaultRollback = true, transactionManager = "annotationDrivenTransactionManager")
public class TestController 
    @Autowired
    public MyClassService myClassServiceMock;

    protected MockMvc mockMvc;

    @Autowired
    protected WebApplicationContext webApplicationContext;

    @Before
    public void setUp() throws Exception {
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    };

    @org.junit.Before
    public void reset() {
        Mockito.reset(myClassServiceMock);
    }

    @org.junit.After
    public void after() { 
         verifyNoMoreInteractions(myClassServiceMock);
    }


    @Test
    public void testSaveObject() throws Exception {
        MyObject object = new MyObjectBuilder().withName("object").withDate("2014-08-15").build();
        when(myClassServiceMock.createObject(objectName, objectDate)).thenReturn(object);

        [.. mockMvcTest which works ... ]

        verify(myclassServiceMock, times(1)).createObject(objectName, objectDate);
    }
}

下面的debug.log部分我不能找出问题的原因,但是当我删除@EnableTransactionManager-Annotation时,没有发生错误...

代码语言:javascript
复制
2014-08-15_17:25:59.608 [main] DEBUG o.s.orm.jpa.JpaTransactionManager - Creating new transaction with name [a.b.c.MyClassService$$EnhancerByMockitoWithCGLIB$$cf62a86c.saveObject]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''
2014-08-15_17:25:59.608 [main] DEBUG o.s.orm.jpa.JpaTransactionManager - Opened new EntityManager [org.hibernate.jpa.internal.EntityManagerImpl@513f39c] for JPA transaction
2014-08-15_17:25:59.616 [main] DEBUG o.s.orm.jpa.JpaTransactionManager - Exposing JPA transaction as JDBC transaction [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@320cac01]
2014-08-15_17:25:59.618 [main] DEBUG o.s.orm.jpa.JpaTransactionManager - Initiating transaction commit
2014-08-15_17:25:59.618 [main] DEBUG o.s.orm.jpa.JpaTransactionManager - Committing JPA transaction on EntityManager [org.hibernate.jpa.internal.EntityManagerImpl@513f39c]
2014-08-15_17:25:59.633 [main] DEBUG o.s.orm.jpa.JpaTransactionManager - Closing JPA EntityManager [org.hibernate.jpa.internal.EntityManagerImpl@513f39c] after transaction
2014-08-15_17:25:59.633 [main] DEBUG o.s.o.jpa.EntityManagerFactoryUtils - Closing JPA EntityManager
2014-08-15_17:25:59.635 [main] DEBUG o.s.t.c.s.DirtiesContextTestExecutionListener - After test method: context [DefaultTestContext@8f72029 testClass = MyControllerTest, testInstance = a.b.c.MyControllerTest@453204e6, testMethod = testSaveObject@MyClassControllerTest, testException = org.mockito.exceptions.misusing.UnfinishedVerificationException: 
Missing method call for verify(mock) here:
-> at a.b.c.MyClassService$$FastClassBySpringCGLIB$$809f2bf.invoke(<generated>)

Example of correct verification:
    verify(mock).doSomething()

我真的很感谢你的帮助,因为我的oddisee和研究已经进行了几天了:

谢谢

EN

回答 1

Stack Overflow用户

发布于 2014-08-16 05:27:11

首先,你没有在测试中初始化Mockito。Read this post

您需要调用MockitoAnnotations.initMocks(),因为您已经在使用@RunWith(SpringJUnit4ClassRunner.class),并且您只能在一个类上指定一个runner。

代码语言:javascript
复制
@Before
public void reset() {
    MockitoAnnotations.initMocks(this);
    // Mockito.reset(myClassServiceMock);   <= remove this line
}

我想你也想在这个mock中使用@Mock而不是@Autowired,这样你就有了一个Mockito mock的实例,然后你可以调用verify()。您还必须将myClassServiceMock注入到被测试的类中(即控制器)

代码语言:javascript
复制
@Mock
public MyClassService myClassServiceMock;

您可以删除对Mockito.reset()的调用,因为@Mock将为每个测试方法创建一个新实例。

如果您打算使用@Autowired并从应用程序上下文中检索MyClassService的实例,那么您将无法对其调用任何Mockito方法,如verify()。

我还希望@TransactionConfiguration不是必需的,因为您永远不会访问您的数据库(因为您正在模拟您的服务层),所以您可以删除它。如果你在测试中访问数据库,那就是另一回事了,但我不能从你提供的代码中看出这一点。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25333973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档