我有一个像这样的单元测试班:
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 {
}
答案 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) {
}
}