- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Spring Framework
4.3.x 和 JUnit
4,我有以下结构
@Transactional
@WebAppConfiguration
@RunWith(Parameterized.class)
@ContextConfiguration(classes={RootApplicationContext.class, ServletApplicationContext.class})
@TestExecutionListeners(listeners={LoggingTestExecutionListener.class}, mergeMode=MergeMode.MERGE_WITH_DEFAULTS)
public class CompleteTest {
@ClassRule
public static final SpringClassRule SPRING_CLASS_RULE = new SpringClassRule();
@Rule
public final SpringMethodRule springMethodRule = new SpringMethodRule();
因此组合:
@RunWith(Parameterized.class)
+ SpringClassRule
+ SpringMethodRule
按预期工作。
我通过 ExternalResource
创建了一个自定义 TestRule
,如下所示:
@Component
public class CompleteRule extends ExternalResource {
private static final Logger logger = LoggerFactory.getLogger(CompleteRule.class.getSimpleName());
private final WebApplicationContext webApplicationContext;
private final Environment environment;
private MockMvc mockMvc;
public CompleteRule(WebApplicationContext webApplicationContext, Environment environment) {
this.webApplicationContext = webApplicationContext;
this.environment = environment;
}
@Override
protected void before() throws Throwable {
...
}
因此,如果我尝试然后使用:
@Transactional
@WebAppConfiguration
@RunWith(Parameterized.class)
@ContextConfiguration(classes={RootApplicationContext.class, ServletApplicationContext.class})
@TestExecutionListeners(listeners={LoggingTestExecutionListener.class}, mergeMode=MergeMode.MERGE_WITH_DEFAULTS)
public class CompleteTest {
private static final Logger logger = LoggerFactory.getLogger(CompleteTest.class.getSimpleName());
@Rule
@Autowired
public CompleteRule completeRule;
@ClassRule
public static final SpringClassRule SPRING_CLASS_RULE = new SpringClassRule();
@Rule
public final SpringMethodRule springMethodRule = new SpringMethodRule();
CompleteRule
始终被忽略,这意味着 ExternalResource.before
方法被覆盖by CompleteRule
永远不会执行。
我尝试过使用
@Rule
public TestRule chain = RuleChain.outerRule(SPRING_CLASS_RULE)
.around(completeRule);
并且不起作用。最糟糕的是不可能添加SpringMethodRule
,因为它实现了MethodRule
,而不是around
方法所要求的TestRule
。
我想避免使用层次结构
并使用规则
来解决。因为这是最佳实践。
因此:有没有办法解决这个问题?
注意我在其他帖子中发现建议如何创建@Rule
并嵌套其他规则。遗憾的是没有关于这种方法的示例来测试它。
注意对于@RunWith(Parameterized.class)
非常重要,因为强制使用@Parameters(name="{index}: ''{ 0}''")
SpringClassRule
和 SpringMethodRule
是根据其 API 为此设计的。
最佳答案
您所描述的场景实际上包含在 SPR-15927 中.
如果 Spring 也是通过规则配置的(例如,通过 SpringClassRule
和 SpringMethodRule
)。
自定义 TestRule
字段实际上将由 Spring 注入(inject),但为时已晚。
换句话来说,当使用 Spring 规则执行依赖注入(inject)时,当前的 Runner 不会注意到注入(inject)的自定义 TestRule 存在,因为该字段之前在规则检测阶段为 null
。
这基本上是一个“先有鸡还是先有蛋”的问题,JUnit 4 没有内置的解决方法。
但是,您可以通过要求 Spring 对现有规则执行依赖注入(inject)来实现类似的效果,但这需要自定义代码。请参阅SPR-10252了解详情。
使用 JUnit Jupiter 5.1,这实际上应该更容易实现。也就是说,您可以毫无问题地将参数化测试支持与 Spring 结合起来。
JUnit Jupiter 的技巧是确保在类级别注册 SpringExtension
(例如,通过 @ExtendWith
、@SpringJUnitConfig
,或类似)。然后,您可以在字段上使用 @RegisterExtension
和 @Autowired
将 Spring 管理的扩展注入(inject)到 JUnit Jupiter 使用的测试实例和中.
关于java - 如何使用自定义@Rule正确配置@RunWith(Parameterized.class) + SpringClassRule + SpringMethodRule?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49238290/
我有一个 gradle 文件 testCompile('junit:junit') testCompile('org.powermock:powermock-core:1.6.5') testComp
我使用 @RunWith(MockitoJUnitRunner.class) 与mockito 进行 junit 测试。但现在我正在使用 spring boot 应用程序并尝试使用 @RunWith(
在通常使用 @Mock 和 @InjectMocks 注释的模拟中,被测类应该使用 @RunWith(MockitoJUnitRunner.class)。 @RunWith(MockitoJUnitR
@RunWith(MockitoJUnitRunner.class) 和 @RunWith(SpringJUnit4ClassRunner.class) 有什么区别?什么时候合适使用它? 最佳答案 M
在使用 Spring Boot 时,我总是将 @SpringBootTest 添加到我的测试类中,并且我的测试按预期工作。我想知道添加 @RunWith(SpringRunner.class) 能带来
目前我的测试类有以下内容: @RunWith(Parameterized.class) @RunWith(PowerMockRunner.class) public class TestApp ext
我的项目是用 JUnit 5 设置的,我想为我的测试使用不同的 Runner,但我什至不能使用 @RunWith 注释,因为它无法编译。在本指南中,https://www.baeldung.com/j
在不研究 JUnit 源代码本身(我的下一步)的情况下,是否有一种简单的方法可以设置每个测试使用的默认 Runner,而不必在每个测试上设置 @RunWith?我们有大量的单元测试,我希望能够全面添加
我正在从仅使用 Intellij 管理我的构建系统转向使用 Intellij/Maven。当我通过@RunWith(KmlParameterizedRunner.class) 使用我自己的运行器运行我
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 7 年前。 此问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-topic在这里
我有一个自定义测试运行程序来运行部分测试,以便我可以将测试分布在不同的 jenkins 节点上。如果运行所有集成测试,则需要一个小时。所以我有 3 台服务器运行 1/3 的测试,总共只需要 20 分钟
我有注释这些注释的类: @ContextConfiguration(locations = { "classpath:pathToXml.xml" }) @RunWith(Spring
我正在尝试让 RunWith(PowerMockRunner.class) 使用我现有的包注释。 版本: powermock 1.4.12 mockito 1.9.0 junit 4.8.2 pack
我有这个非常简单的类: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations={"classpath*:/
以下 Java 类无法在我的 IDE (Intellij IDEA) 中运行。 IDE 没有给出任何原因,这使得故障排除变得痛苦和困难。 这个类看起来像这样: import cucumber.api.
这个问题在这里已经有了答案: Initialising mock objects - Mockito (8 个答案) 关闭 6 年前。 我正在使用 Junit 4.8.2。当我使用 @RunWith
我有以下测试代码: package soundSystem; import static org.junit.Assert.*; import org.junit.Test; import org.j
我正在使用 spring boot starter test 编写 JUnit 测试用例。我喜欢使用 JunitParamrunner,它有助于为参数化测试传递文件。基本上它逐行读取文件中的数据,并为
我正在处理 BDD 文件并尝试使用 JUnit 进行测试。 我想将 RunCukesTest 类与 @RunWith(Cucumber.class) 一起使用。 我在很多网站上搜索过如何安装要求,但我
这个注解有什么作用? 我想什么时候使用它? 我什么时候不想使用它? @RunWith(SpringJUnit4ClassRunner.class) 当我使用 Google 搜索时,我可以找到更多的用法
我是一名优秀的程序员,十分优秀!