Mockito - 创建嵌套的模拟对象

mas*_*asT 7 java mockito

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

public interface BaseManager {
    public Query createQuery(String queryString);
}
Run Code Online (Sandbox Code Playgroud)

和一个实现类

public class BaseManagerImpl implements BaseManager {
    @Autowired
    private SessionFactory sessionFactory;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

public interface RegistrationManager {
    @Transactional
    public List<Country> getCountries();
}
Run Code Online (Sandbox Code Playgroud)

和一个实现类

public class RegistrationManagerImpl implements RegistrationManager {
    @Autowired
    private BaseManager baseManager;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

 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
}
Run Code Online (Sandbox Code Playgroud)

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

gme*_*r.m 5

您必须@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
}
Run Code Online (Sandbox Code Playgroud)

希望这是你正在寻找的!


Ada*_*old 5

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

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

所以你BaseManagerImpl先测试一下:

public class BaseManagerImplTest {

    private BaseManagerImpl target;

    // ...
}
Run Code Online (Sandbox Code Playgroud)

然后你测试RegistrationManagerImpl

public class RegistrationManagerImplTest {

    private RegistrationManagerImpl target;

    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

Mockito.when(myMock.someMethod()).thenReturn(someResultObject);
Run Code Online (Sandbox Code Playgroud)