方法仅在调试时有效

时间:2018-08-14 09:02:52

标签: java unit-testing mockito tdd spock

我在模拟接口值之一时遇到问题。当我在调试模式下运行测试时,它工作正常,但是运行时我有org.mockito.exceptions.misusing.UnfinishedStubbingException

更新16.08.2018:它仅在我在断线或之前设置断点时才有效-如果没有断点,则测试也会在调试时崩溃。而且,如果我一直拿着F9,则某些测试通过并且有些失败,因此必须将其与初始化时间联系在一起,但仍然不知道如何解决该问题

在调试模式下可以通过,但是在运行模式下,我在执行String name = getPhoneBookName();

的服务时遇到异常

我还尝试将Mockito.when移至设置块,但这无济于事

有什么想法吗?

代码如下:

MyServiceSpec:

private PropertyDAO propertyDAO = mock(PropertyDAO.class)     

def "Should fill all fields property for existing user"() {

given:"mock values to check proper form" 
when(propertyDAO.getValue(PropertyDAO.Key.REMOTE_BOOK_NAME)).thenReturn("Phonebook")

when: 
service.someMethod()

服务:

someMethod() {
    String name = getPhoneBookName();
    if (name != null) {
        map.put("remotePhoneBookName", name);
    }
}

@Override
public String getPhoneBookName() {
    return propertyDAO.getValue(PropertyDAO.Key.REMOTE_BOOK_NAME);
}

PropertyDao

public interface PropertyDAO {
String VERSION_KEY = "VERSION";

public enum Key {
    VERSION,
    REMOTE_BOOK_NAME
}
String getValue(Key key);

PropertyHibernateDAO

@Repository("propertyDAO")
@Qualifier("hibernate")
public class PropertyHibernateDAO implements PropertyDAO {

@Override
@Transactional(readOnly = true)
public String getValue(Key key) {
    String result = null;
    Session session = sessionFactory.getCurrentSession();
    String dbKey = DB_KEYS.get(key);
    Criteria criteria = session.createCriteria(Property.class);
    criteria.add(Restrictions.eq("key", dbKey));
    Property property = (Property) criteria.uniqueResult();
    if (property != null) {
        result = property.getValue();
    }
    return result;
}

1 个答案:

答案 0 :(得分:0)

好,知道了。

事实证明,在关键模拟下面的测试中,我尝试从问题中模拟someMethod(),然后在执行时崩溃。非常感谢@MichałPiątkowski,因为最后您是对的;)

当我替换时它起作用:

     when(propertyDAO.getValue(PropertyDAO.Key.REMOTE_BOOK_NAME)).thenReturn("Phonebook")
 when(configuration.getStationValues(any(), any(), anyString())).thenReturn(someMethod())

     when(propertyDAO.getValue(PropertyDAO.Key.REMOTE_BOOK_NAME)).thenReturn("Phonebook") 
def method =someMethod() 
when(configuration.getStationValues(any(), any(), anyString())).thenReturn(method)

即使在下一栋楼中,您也可能会感觉到代码的味道,但是我暂时还不知道其他解决方法