繁体   English   中英

Mockito - 创建嵌套的模拟对象

[英]Mockito - Creating nested mock objects

我正在学习Mockito。 我在为嵌套对象创建模拟时遇到问题。 看到

public interface BaseManager {
    public Query createQuery(String queryString);
}

和一个实现类

public class BaseManagerImpl implements BaseManager {
    @Autowired
    private SessionFactory sessionFactory;
    // ...
}

模块级别的hibernate管理器,例如:

public interface RegistrationManager {
    @Transactional
    public List<Country> getCountries();
}

和一个实现类

public class RegistrationManagerImpl implements RegistrationManager {
    @Autowired
    private BaseManager baseManager;
    // ...
}

现在我在创建模拟基础管理器方面遇到了问题。 我的测试类是:

 public class MockitoTest {
    private RegistrationManager registrationManager = new RegistrationManagerImpl();

    @Mock private BaseManager baseManager;

    @Mock private SessionFactory sessionFactory;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    //  baseManager.setSessionFactory(sessionFactory);
        registrationManager.setBaseManager(baseManager);
    }
    // ...
    // @Test
}

问题: sessionFactory未在baseManager中实例化。 请帮助创建模拟对象。 提前致谢!

您必须在要测试的类之前放置@InjectMocks注释并模拟basemanger或sessionFactory调用的方法。

public class MockitoTest {
    @InjectMocks
    private RegistrationManager registrationManager = new RegistrationManagerImpl();

    @Mock private BaseManager baseManager;

    @Mock private SessionFactory sessionFactory;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    //  baseManager.setSessionFactory(sessionFactory);
        registrationManager.setBaseManager(baseManager);

        Mockito.when(baseManager.yourMethod()).thenReturn(someObject);
    }
    // ...
    // @Test
}

希望这是你正在寻找的!

问题是您正在创建BaseManager的模拟,但只有BaseManagerImpl具有SessionFactory字段。 Mockito不了解BaseManagerImpl 在您的代码中,您创建两个完全独立的模拟。

单元测试是关于测试一个单元 所以你应该分别测试BaseManagerImplRegistrationManagerImpl

所以你首先测试BaseManagerImpl

public class BaseManagerImplTest {

    private BaseManagerImpl target;

    // ...
}

然后你测试RegistrationManagerImpl

public class RegistrationManagerImplTest {

    private RegistrationManagerImpl target;

    // ...
}

我建议您在测试类中使用名称target或类似的测试目标,因为它会使您的代码更容易阅读。

另一件事:如果你测试一个对象,它的所有依赖项都应该被模拟,但你不应该关心模拟的依赖项。 你只是模拟他们的方法调用,如:

Mockito.when(myMock.someMethod()).thenReturn(someResultObject);

你不能注入一个mockSessionFactorymockBaseManager

在测试RegistrationManagerImpl ,您只需要mock BaseManager 您可以使用方法存根,以便在从RegistrationManagerImpl方法调用这些方法时,方法BaseManager将返回存根值。 所以,如果你有一个RegistrationManagerImpl

public class RegistrationManagerImpl implements RegistrationManager {
    @Autowired
    private BaseManager baseManager;
    // ...
    public String doSomething(){
         return baseManager.process();  
    }
}

你可以写下你的MockitoTest

public class MockitoTest {
    @InjectMocks
    private RegistrationManager registrationManager = new RegistrationManagerImpl();

    @Mock private BaseManager baseManager;

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

    }
    // ...
    @Test
    public void test() {
    when(baseManager.process()).thenReturn("hello");

    assertEquals("hello", registrationManager.doSomething());
    }
}

在测试BaseManager ,你需要使用SeesionFactory mock

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM