3

我尝试模拟getResourceAsStream我在构造函数中调用的方法。

public Conn() {
    stream = Conn.class.getClass().getResourceAsStream(PATH);
}

对于模拟框架,我更喜欢 Mockito + PowerMockito。

    @RunWith(PowerMockRunner.class)
    @PrepareForTest(Conn.class)
    public class ConnTest {

        @Mock
        private InputStream streamMock;

        private Conn conn;

        @Before
        public void before() {
            initMocks(this);
        }

        @Test
        public void test() {    
            PowerMockito.mockStatic(Conn.class);
            PowerMockito.when(Connector.class.getResourceAsStream("/prop.properties")).thenReturn(streamMock);
            conn = new Conn();
        }

        @After
        public void after() {
            reset(streamMock);
        }
     }

但是方法thenReturn不返回模拟。我该如何解决?

4

3 回答 3

1

您可以将资源抽象为一个类。

class StreamFetcher {

InputStream fetchStream(String path) {
return StreamFetcher.class.getClass().getResourceAsStream(path);
}

}

在你的课堂上

class Conn {
public Conn(StreamFetcher streamFetcher) {
    stream = streamFetcher.fetchStream(PATH);
}
}

这样你甚至不必做一个模拟——你可以为测试创建你自己的 impl 来做你需要做的任何事情。

此外,您实际上可以抽象更多,并且可能以某种方式处理 Stream。我不了解业务背景,因此无法真正帮助您解决这个问题。

于 2015-09-12T10:06:05.680 回答
0

您可以执行以下操作:

    @RunWith(PowerMockRunner.class)
    @PrepareForTest(Class.class)
    public class ConnTest {

        @Mock
        private InputStream streamMock;

        private Conn conn;

        @Before
        public void before() {
            initMocks(this);
        }

        @Test
        public void test() {    
            PowerMockito.mockStatic(Class.class);
            PowerMockito.when(Connector.class.getClass().getResourceAsStream("/prop.properties")).thenReturn(streamMock);
            conn = new Conn();
        }

        @After
        public void after() {
            reset(streamMock);
        }
     }

在这里,您在类对象之上存根资源,这就是为什么您需要使用andClass.class来准备测试的原因。@PrepareForTest(Class.class)PowerMockito.mockStatic(Class.class);

我不确定它是否适用于构造函数,但对于调用getClass.getResourceAsStream("anyString")它的方法可以正常工作(我已经测试过)。

于 2016-08-11T12:48:47.227 回答
0

它不会返回模拟,因为被测代码new Conn()没有调用

Connector.class.getResourceAsStream(...)

它调用

Conn.class.getResourceAsStream(...)

您的代码通过将方法存根更改为:

PowerMockito.when(Conn.class.getResourceAsStream("/prop.properties")).thenReturn(streamMock);
于 2015-09-22T01:47:25.460 回答