Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Mockito:调用层次结构中的mock对象-链接调用_Java_Spring_Unit Testing_Mocking_Mockito - Fatal编程技术网

Java Mockito:调用层次结构中的mock对象-链接调用

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

可以用Mockito模拟对象吗?Mockito在对象层次结构中的某个地方被调用

让我们假设以下类:

@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();
}