PowerMock:模拟只影响一个测试的静态方法

Are*_*reo 5 java unit-testing powermock

我的情况:

我想添加一个新的测试。我需要模拟 Service 类的一个静态方法 X。不幸的是,现有的测试正在以某种方式使用这种静态方法。

当我使用 PowerMock 模拟 X 方法时,其他测试失败了。更重要的是我不应该接触其他测试。

是否有机会仅为一项测试模拟静态方法?(使用 PowerMock)。

提前致谢。

Har*_*Bro 1

当然,这是可能的!唯一可能遇到问题的时候是如果您尝试同时测试多个线程......我在下面举了一个如何执行此操作的示例。享受。

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.easymock.EasyMock.*;

import static org.junit.Assert.*;
@RunWith(PowerMockRunner.class)
@PrepareForTest(IdGenerator.class)
public class TestClass {

    @Test
    public void yourTest()
    {
        ServiceRegistrator serTestObj = new ServiceRegistrator();

        PowerMock.mockStatic(IdGenerator.class);
        expect(IdGenerator.generateNewId()).andReturn(42L);
        PowerMock.replay(IdGenerator.class);
        long actualId = IdGenerator.generateNewId();

        PowerMock.verify(IdGenerator.class);
        assertEquals(42L,actualId);
     }

    @Test
    public void unaffectedTest() {
        long actualId = IdGenerator.generateNewId();

        PowerMock.verify(IdGenerator.class);
        assertEquals(3L,actualId);
    }
}
Run Code Online (Sandbox Code Playgroud)

测试类

public class IdGenerator {
     public static long generateNewId()
      {
        return 3L;
      }
}
Run Code Online (Sandbox Code Playgroud)