有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Powermock+Mockito不工作

正在尝试使用Powermock模拟SystemTray上的静态方法。不知道为什么这不起作用。我已经检查了Powermock的匹配->;Mockito版本,我想我已经遵循了添加正确注释的所有步骤,并使用正确的PowerMock方法来设置静态注释

SystemTray上的静态方法似乎在没有when()设置的存根功能的情况下被调用

我在这里混合了Powermock和Mockito调用,但根据文档,这是正确的

package CommissionChecker;

import org.apache.commons.logging.Log;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.runners.MockitoJUnitRunner;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.springframework.test.util.ReflectionTestUtils;

import java.awt.*;
import java.io.IOException;
import java.util.List;

import static org.mockito.Mockito.*;
import static org.powermock.api.mockito.PowerMockito.mockStatic;

@RunWith(PowerMockRunner.class)
@PrepareForTest(SystemTray.class)
public class DisplayManagerTest {

    @Mock
    Log logMock;
    @Mock
    Runner runnerMock;

    @Test
    public void display_manager_does_nothing_if_system_tray_is_not_supported() throws IOException, AWTException {
        mockStatic(SystemTray.class);
        when(SystemTray.isSupported()).thenReturn(false);

        new DisplayManager(runnerMock);

        verifyZeroInteractions(runnerMock);
    }
}

这些是我的maven依赖项

    <powermock.version>1.5.2</powermock.version>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-all</artifactId>
        <version>1.9.5</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>${powermock.version}</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <version>${powermock.version}</version>
        <scope>test</scope>
    </dependency>

共 (3) 个答案

  1. # 1 楼答案

    我也有同样的问题,但我手动添加了导入,问题消失了

    import org.powermock.modules.junit4.PowerMockRunner;
    
  2. # 3 楼答案

    下面是一个使用PowerMock的简单示例:

    package test;
    
    import static org.easymock.EasyMock.expect;
    import static org.easymock.EasyMock.replay;
    import static org.easymock.EasyMock.verify;
    import static org.testng.Assert.*;
    
    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 org.testng.IObjectFactory;
    import org.testng.annotations.ObjectFactory;
    import org.testng.annotations.Test;
    
    import demo.powermock.IdGenerator;
    import demo.powermock.ServiceRegistartor;
    //import org.easymock.classextension
    @RunWith(PowerMockRunner.class)
    @PrepareForTest(IdGenerator.class)
    public class Test111 {
        @ObjectFactory
        public IObjectFactory getObjectFactory() {
            return new org.powermock.modules.testng.PowerMockObjectFactory();
        }
    
        @Test
        //@org.testng.annotations.Test
        public void testRegisterService() throws Exception {
            long expectedId = 42;
    
            // We create a new instance of test class under test as usually.
            ServiceRegistartor tested = new ServiceRegistartor();
    
            // This is the way to tell PowerMock to mock all static methods of a
            // given class
            PowerMock.mockStatic(IdGenerator.class);
    
            /*
             * The static method call to IdGenerator.generateNewId() expectation.
             * This is why we need PowerMock.
             */
            expect(IdGenerator.generateNewId()).andReturn(expectedId);
    
            // Note how we replay the class, not the instance!
            PowerMock.replay(IdGenerator.class);
    
            long actualId = new ServiceRegistartor().registerService();
    
            // Note how we verify the class, not the instance!
            PowerMock.verify(IdGenerator.class);
    
            // Assert that the ID is correct
            assertEquals(expectedId, actualId);
        }
    }