【问题标题】:Mockito- mock field in classMockito- 课堂上的模拟场
【发布时间】:2015-11-27 07:40:39
【问题描述】:

我有一个与 Mockito 框架有关的问题。有什么方法可以模拟类中的字段吗?假设我们有:

@Component
public class A{
    @Autowired
    B b;

    public methodExample(){b.doSth();}
}


class C {
    @Autowired
    A a;
}

@Test
    public void testMethodExample(){...}
}

是否有可能模拟 B 对象以强加方法 doSth 的返回值?我知道我可以将模拟对象作为构造函数的参数传递,但我想知道是否还有其他选择?

【问题讨论】:

  • 这正是@InjectMocks 注释的用途。威廉做对了!

标签: unit-testing spring-mvc mockito


【解决方案1】:

你可以看看@InjectMocks。 有了这个注解,Mockito 将尝试分别通过构造函数、属性和字段来分配模拟,并在第一个成功的方法处停止。 因此,您的场景的单元测试可能如下所示:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

@RunWith( MockitoJUnitRunner.class )
public class c
{

    @InjectMocks
    A a;

    @Mock
    B b;

    @Test
    public void testMethodExample()
    {
        a.methodExample();
    }
}

一些值得关注的点:

  • @InjectMocks 只会考虑用@Mock 注释的字段
  • 必须使用MockitoJUnitRunner或调用org.mockito.MockitoAnnotations.initMocks(this); 才能创建和注入您的模拟。

【讨论】:

    【解决方案2】:

    您可以提供一个仅用于测试的受保护设置器,并让您的测试包结构反映您的主代码的包结构。

    或者您可以根据需要使用 Powermock 扩展来模拟私有/受保护的字段。

    https://code.google.com/p/powermock/wiki/BypassEncapsulation

    @Test
    public void testDoSomething(){
        A a = new A();
        B mockedB = //create a mock;
    
        Whitebox.setInternalState(a, "b", mockedB);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多