Java Mockito:调用层次结构中的mock对象-链接调用
可以用Mockito模拟对象吗?Mockito在对象层次结构中的某个地方被调用 让我们假设以下类:Java Mockito:调用层次结构中的mock对象-链接调用,java,spring,unit-testing,mocking,mockito,Java,Spring,Unit Testing,Mocking,Mockito,可以用Mockito模拟对象吗?Mockito在对象层次结构中的某个地方被调用 让我们假设以下类: @Component Class A @Autowired B b method obtainSalaryA() calls b.calculateSalary() @Component Class B @Autowired C c method calculateSalary() calls c.getDatabaseSal
@Component
Class A
@Autowired B b
method obtainSalaryA()
calls b.calculateSalary()
@Component
Class B
@Autowired C c
method calculateSalary()
calls c.getDatabaseSalary()
@Component
Class C
getDatabaseSalary()
在单元测试中,我想对方法
从class A
中获取工资,但同时模拟C进行单元测试,以便在层次结构中调用此方法时替换getDatabaseSalary()
的返回值。我没有尝试过,但看看它是否有效,或者它的一些变体
class YourTestClass {
@Mock(answer = Answers.RETURNS_SMART_NULLS)
C c;
@InjectMocks
B b;
@InjectMocks
A a;
}
然后在测试中,对c.getDatabaseSalary方法执行when..thenReturn
另请参见。实际上,如果您测试“a”,您将模拟类“b”,并且您可以从b返回所需的任何内容。如果你测试“b”,你就会模仿“c”。始终尝试在没有依赖项的情况下进行测试(单元测试)
您可以对设计进行一些修改
编辑:根据您的评论,您正在进行集成测试。测试看起来像这样
@Autowired
private A a;
@Autowired
private B b;
@Mock
private C c;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
public void test() {
b.setC(c);
when(c.getDatabaseSalary()).thenReturn(...);
a.obtainSalaryA();
}
谢谢。您的建议主要集中在测试的类A上,所有其他依赖项都是模拟的。如果测试是一个集成测试,应该测试A和B的功能,例如,C类中的方法应该在测试中提供其他返回值,而不是在生产中,那么您将如何设计测试?在这里使用Spring的ActiveProfiles在测试中注入类C的另一个实现而不使用mock的唯一选项是什么?您仍然可以使用mock。请参阅我的最新答案。我现在没有Spring设置,所以请告诉我它是否有效。我认为它不起作用。Autowired ist不是Mockito注释,“a”将为空。如果打算进行集成测试,则问题应为changed@Kescha这不是问题。Spring集成测试与Spring连接,并使用SpringJUnit4ClassRunner.class
运行<代码>@Autowired
将被注入。如果你错过了runwith:),我不确定是否应该进行这样的框架混合。看这里
@Autowired
private A a;
@Autowired
private B b;
@Mock
private C c;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
public void test() {
b.setC(c);
when(c.getDatabaseSalary()).thenReturn(...);
a.obtainSalaryA();
}