【问题标题】:Mockito code during @Before annoted method solution@Before 注释方法解决方案期间的 Mockito 代码
【发布时间】:2011-08-24 15:26:04
【问题描述】:

我是使用 Mockito 框架(和行为/测试驱动开发)和使用的新手 帮助我编写一些代码;

我正在编写自己的用于 xml 的 Java 库来创建图形和 我首先尝试验证一些行为: (MockitoAnnotations.initMocks(Class)用于BaseTestClass):

public class GeneralXml extends BaseTestClass {

    private static final String TAG = "General XML";
    @Mock(name="xml") private XmlGraphics mockXML;

    @Before
    public void setUp() throws Exception{ 

        //stub method parseDimension
        when(mockXML.parseDimension(anyString()))
            .thenReturn(500);

        // stub method parsePosition: 500 X 500 X 500 is an
        // arbitrary dimension of window
        when(mockXML.parsePosition(anyString()))
            .thenReturn(
                new Random().nextFloat() * mockXML.parseDimension(Xml.WIDTH),
                new Random().nextFloat() * mockXML.parseDimension(Xml.HEIGHT),
                new Random().nextFloat() * mockXML.parseDimension(Xml.DEPHT));

        // Now Colors must have betwwen 0 and 255
        // (RGB color)
        when(mockXML.parseColorComponent(anyString()))
            .thenReturn(
                new Random().nextInt(256),    
                new Random().nextInt(256),    
                new Random().nextInt(256));    

    }

但我在所有后续验证中都收到错误消息,例如:

@Test
public void mockPosition() {
    Log.d(TAG, "mock", "x = "+mockXML.parsePosition(Xml.X));
    Log.d(TAG, "mock", "y = "+mockXML.parsePosition(Xml.Y));
    Log.d(TAG, "mock", "z = "+mockXML.parsePosition(Xml.Z));

    verify(mockXML, times(3)).parsePosition(anyString());
}    

我认为我的错误在于:

 when(mockXML.parsePosition(anyString()))    
        .thenReturn(    
            new Random().nextFloat() * mockXML.parseDimension(Xml.WIDTH),
            new Random().nextFloat() * mockXML.parseDimension(Xml.HEIGHT),
            new Random().nextFloat() * mockXML.parseDimension(Xml.DEPHT));

这不是一个有效的代码?还是我误解了什么? 感谢您的帮助

【问题讨论】:

    标签: java junit4 mockito xunit


    【解决方案1】:

    尝试将其添加为 setUp() 函数的第一行:

        MockitoAnnotations.initMocks(this);
    

    【讨论】:

    • 我从 BaseTestClass 中“未继承”GeneralXml(它的ef 有 MockitoAnnotation.initMocks(this),并放入 setUp(),但不起作用;
    • 我收到了来自 JUnit 的以下响应:org.mockito.exceptions.misusing.UnfinishedStubbingException:在此处检测到未完成的存根:-> 在 gml.processing.xml.reader.test.GeneralXml.setUp(GeneralXml.java :34) 例如thenReturn() 可能会丢失。正确的存根示例:when(mock.isOk()).thenReturn(true); when(mock.isOk()).thenThrow(异常); doThrow(exception).when(mock).someVoidMethod();提示:1. 缺少 thenReturn() 2. 尽管存根方法可能返回模拟,但您不能在 thenReturn 方法中内联模拟创建 (mock()) 调用(参见问题 53)
    • 好的,所以它会抛出错误,因为您在调用模拟对象时回答了对模拟的调用。您似乎误解了 Mockito 的工作原理。您需要像通常“私有 XmlGraphics mockXML = new XmlGraphics()”一样创建对象来测试对象(注意没有 Mock 注释)。如果您的对象需要任何依赖项并且您需要模拟它们的行为,您只需要使用 Mock 注释。如果您想在此处粘贴 XmlGraphics 类中的函数,我将向您展示如何测试它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 2016-06-21
    • 2013-07-22
    • 2012-04-06
    • 1970-01-01
    相关资源
    最近更新 更多