-
Notifications
You must be signed in to change notification settings - Fork 260
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
JUnit5 support for the existing soft-assertions support (Expect.create JUnit4 Rule) #893
Comments
Thanks. As you've seen, JUnit 5 is a giant TODO for us, one that we're unlikely to carve off time for in the near future :( I can say one slightly encouraging thing, which is that your proposal looks useful even to non-JUnit-5 users. (Maybe we've even heard requests for it from such users? I can't seem to find any offhand, though.) Then I can say one more discouraging thing, which is that we have had a proposal open inside Google for something like this for a couple years, and we haven't acted on it. Now, that proposal was more about adding context to a group of assertions:
If we take into account that such a feature could support all of...
...then that provides at least a little more motivation. Still probably not a big priority for us, given that Truth itself continues not to be a big priority for us, sadly. |
I created PR #706 over a year ago which enables @Test
public void test(StandardSubjectBuilder expect) {
expect.that(1).isEqualTo(2);
expect.that(-1).isGreaterThan(0);
} in JUnit 5. I think that makes sense if you're actually using JUnit 5, but if you want to use it in any test framework, then your ThingyThing seems reasonable. |
@ephemient that seems great! Perhaps the two could be merged to enable both options... |
My solution Inspired by class ExpectExtension : BeforeEachCallback, AfterEachCallback, InvocationInterceptor,
ParameterResolver {
private var _expect: Expect? = null
val expect: Expect
get() = _expect!!
override fun beforeEach(context: ExtensionContext) {
_expect = Expect.create()
}
override fun interceptTestMethod(
invocation: InvocationInterceptor.Invocation<Void>,
invocationContext: ReflectiveInvocationContext<Method>,
extensionContext: ExtensionContext
) {
_expect?.apply(
object : Statement() {
override fun evaluate() {
invocation.proceed()
}
},
Description.EMPTY,
)?.evaluate()
}
override fun afterEach(context: ExtensionContext) {
_expect = null
}
override fun supportsParameter(
parameterContext: ParameterContext,
extensionContext: ExtensionContext
): Boolean {
val paramType = parameterContext.parameter.type
return paramType is Type && paramType == Expect::class.java
}
override fun resolveParameter(
parameterContext: ParameterContext,
extensionContext: ExtensionContext
): Any {
return expect
}
} A. @Test
@ExtendWith(ExpectExtension::class)
fun test(expect: Expect) {
expect.that<Int>(1).isEqualTo(2)
expect.that<Int>(1).isEqualTo(3)
expect.that<Int>(1).isEqualTo(4)
} B. @JvmField
@RegisterExtension
val extension = ExpectExtension()
@Test
fun test2() {
extension.expect.that<Int>(1).isEqualTo(2)
extension.expect.that<Int>(1).isEqualTo(3)
extension.expect.that<Int>(1).isEqualTo(4)
}
@Test
fun test3(expect: Expect) {
expect.that<Int>(1).isEqualTo(2)
expect.that<Int>(1).isEqualTo(3)
expect.that<Int>(1).isEqualTo(4)
} I look forward to any form of Expect Extension for JUnit5 being added in the future! |
As belatedly noted on #894, anything that we label as P3 has no timeline for being reviewed :( We hope to eventually schedule some more time for Truth (especially for features that could work well in Kotlin, like this one), but there are no plans yet. (Another thing we should do: Figure out if this feature request and #266 represent different requests or if they could be merged.) |
From a purely JUnit5 perspective, am I missing something?
I made this wrapper around the core Expect function:
Used like:
Outputs:
P.s. amazing framework BTW - beautiful. Especially for chained custom objects. Amazing. Wish I'd found it sooner.
The text was updated successfully, but these errors were encountered: