JMock with(instanceOf(Integer.class)) does not compile in Java 8
Asked Answered
N

1

1

After upgrading to Java 8. I now have compile errors of the following kind:

The method with(Matcher<Object>) is ambiguous for the type new Expectations(){}

It is caused by this method call:

import org.jmock.Expectations;

public class Ambiguous {
    public static void main(String[] args) {
        Expectations expectations = new Expectations();
        expectations.with(org.hamcrest.Matchers.instanceOf(Integer.class));
    }
}

It seems like with is returned from instanceOf() is ambiguous from what with() expects, or vice versa. Is there a way to fix this?

Nictitate answered 6/5, 2015 at 21:20 Comment(2)
Exact JDK version? JMock version? And a complete source example would be helpful.Bibliology
Probably you can add type to instanceof: expectations.with(org.hamcrest.Matchers.<Integer>instanceOf(Integer.class)).Kantian
C
2

There is some easy ways to help the compiler.

assign the matcher to a local variable:

public static void main(String[] args) {
    Expectations expectations = new Expectations();
    Matcher<Integer> instanceOf = Matchers.instanceOf(Integer.class);
    expectations.with(instanceOf);
}

you can specify the type parameter with a type witness as follows:

public static void main(String[] args) {
    Expectations expectations = new Expectations();
    expectations.with(Matchers.<Integer>instanceOf(Integer.class));
}

wrap the instanceOf in your own type safe method:

public static void main(String[] args) {
    Expectations expectations = new Expectations();
    expectations.with(instanceOf(Integer.class));
}

public static <T> Matcher<T> instanceOf(Class<T> type) {
    return Matchers.instanceOf(type);
}

I prefer the last solution since it is reusable and the test remains easy to read.

Christianize answered 7/5, 2015 at 13:56 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.