模拟静态方法+运行参数化测试=“未找到匹配项”

时间:2018-09-23 00:59:25

标签: java unit-testing static-methods powermockito

我有一个像这样的单元测试班:

        var updList = new List<UpdateDefinition<MongoLogEntry>>();
        var collection = db.GetCollection<MongoLogEntry>(HistoryLogCollectionName);

        var upd = Builders<MongoLogEntry>.Update.Set(r => r.Status, status)
            .Set(r => r.DateModified, DateTime.Now);
        updList.Add(upd);

        if (errorDescription != null)
            updList.Add(Builders<MongoLogEntry>.Update.Set(r => r.ErrorDescription, errorDescription));

        var finalUpd = Builders<MongoLogEntry>.Update.Combine(updList);

        collection.UpdateOne(r => r.CadNum == cadNum, finalUpd, new UpdateOptions { IsUpsert = true });

现在,我需要模拟一些静态方法,所以我这样做:

import junitparams.JUnitParamsRunner;

@RunWith(JUnitParamsRunner.class)
public class CustomerTest
{

    @Test
    @Parameters({
    "true",
    "false",
    })
    public void testMaritalStatus(boolean married) {


    }

}

但是要使用它,我也需要这样做:

import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.modules.junit4.PowerMockRunnerDelegate;

@Before
public void setup() {
     PowerMockito.mockStatic(Helpers.class)
}

问题:出现此错误:

@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(JUnitParamsRunner.class)
public class CustomerTest {


}

1 个答案:

答案 0 :(得分:0)

这是由于 PowerMock 中的bug。显然, JUnitParams 传递给 PowerMock 的方法的 DisplayName 与其狭义的要求不匹配。给出以下解决方法:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.19.1</version>
    <configuration>
        <systemPropertyVariables>
            <JUnitParams.flat>true</JUnitParams.flat>
        </systemPropertyVariables>
    </configuration>
</plugin>

这给我们:

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>pl.pragmatists</groupId>
        <artifactId>JUnitParams</artifactId>
        <version>1.0.4</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-module-junit4</artifactId>
        <version>1.7.4</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.powermock</groupId>
        <artifactId>powermock-api-mockito</artifactId>
        <version>1.7.4</version>
        <scope>test</scope>
    </dependency>
</dependencies>

<!-- workaround -->
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <configuration>
                <systemPropertyVariables>
                    <JUnitParams.flat>true</JUnitParams.flat>
                </systemPropertyVariables>
            </configuration>
        </plugin>
    </plugins>
</build>

将其放在我的pom.xml中,并将@PrepareForTest(Helpers.class)添加到CustomerTest之后,测试运行正常:

import junitparams.JUnitParamsRunner;
import junitparams.Parameters;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.modules.junit4.PowerMockRunnerDelegate;

@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(JUnitParamsRunner.class)
@PrepareForTest(Helpers.class)
public class CustomerTest {

    @Before
    public void setup() {
        PowerMockito.mockStatic(Helpers.class);
    }

    @Test
    @Parameters({
            "true",
            "false",
    })
    public void testMaritalStatus(boolean married) {

    }
}