10

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

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

和一个实现类

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

模块级休眠管理器,例如:

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 中实例化。 请帮助创建模拟对象。提前致谢!

4

3 回答 3

5

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

单元测试是关于测试一个单元BaseManagerImpl所以你应该RegistrationManagerImpl单独测试。

所以你BaseManagerImpl先测试:

public class BaseManagerImplTest {

    private BaseManagerImpl target;

    // ...
}

然后你测试RegistrationManagerImpl

public class RegistrationManagerImplTest {

    private RegistrationManagerImpl target;

    // ...
}

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

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

Mockito.when(myMock.someMethod()).thenReturn(someResultObject);
于 2013-11-06T13:16:22.297 回答
4

您必须将@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
}

希望这就是你要找的!

于 2013-11-06T13:10:44.920 回答
2

您不能将 a mockofSessionFactory注入 a mockof BaseManager

当你在测试RegistrationManagerImpl时,你只需要一个mockof BaseManager。您可以使用方法存根,以便在BaseManager从方法调用这些方法时,这些方法将返回存根值RegistrationManagerImpl。所以,如果你有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,还有你需要使用mockSeesionFactory.

于 2013-11-06T13:31:12.197 回答