Mockito: GeçersizUseOfMatchersException


141

DNS denetimi gerçekleştiren bir komut satırı aracım var. DNS denetimi başarılı olursa, komut diğer görevlerle devam eder. Mockito kullanarak bunun için birim testleri yazmaya çalışıyorum. İşte benim kod:

public class Command() {
    // ....
    void runCommand() {
        // ..
        dnsCheck(hostname, new InetAddressFactory());
        // ..
        // do other stuff after dnsCheck
    }

    void dnsCheck(String hostname, InetAddressFactory factory) {
        // calls to verify hostname
    }
}

InetAddressSınıfın statik bir uygulamasını alay etmek için InetAddressFactory kullanıyorum . İşte fabrika kodu:

public class InetAddressFactory {
    public InetAddress getByName(String host) throws UnknownHostException {
        return InetAddress.getByName(host);
    }
}

İşte benim birim test durumum:

@RunWith(MockitoJUnitRunner.class)
public class CmdTest {

    // many functional tests for dnsCheck

    // here's the piece of code that is failing
    // in this test I want to test the rest of the code (i.e. after dnsCheck)
    @Test
    void testPostDnsCheck() {
        final Cmd cmd = spy(new Cmd());

        // this line does not work, and it throws the exception below:
        // tried using (InetAddressFactory) anyObject()
        doNothing().when(cmd).dnsCheck(HOST, any(InetAddressFactory.class));
        cmd.runCommand();
    }
}

testPostDnsCheck()Test çalıştırmaya ilişkin istisna :

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
2 matchers expected, 1 recorded.
This exception may occur if matchers are combined with raw values:
    //incorrect:
    someMethod(anyObject(), "raw String");
When using matchers, all arguments have to be provided by matchers.
For example:
    //correct:
    someMethod(anyObject(), eq("String by matcher"));

Bunu çözmek için herhangi bir girdi var mı?

Yanıtlar:


283

Hata mesajı çözümü özetlemektedir. Çizgi

doNothing().when(cmd).dnsCheck(HOST, any(InetAddressFactory.class))

tüm ham değerleri veya tüm eşleştiricileri kullanmanız gerektiğinde bir ham değer ve bir eşleyici kullanır. Doğru sürüm okunabilir

doNothing().when(cmd).dnsCheck(eq(HOST), any(InetAddressFactory.class))

8
Ne kadar aptal olduğumu. 2. parametrenin neden hata verdiğini analiz etmeye devam ettim. Açıkladığınız için teşekkürler. Mockito için çok yeniyim, bu benim ilk karşılaşmam.
devang

32

Uzun zamandır aynı problemi yaşadım, sık sık Matchers ve değerleri karıştırmam gerekiyordu ve bunu asla Mockito ile yapmayı başaramadım .... yakın zamana kadar! Bu yazı, bu yazı oldukça eski olsa bile birisine yardımcı olacağını umarak buraya koydum.

Mockito'da Matchers AND değerlerini birlikte kullanmak açıkça mümkün değildir, ancak bir değişkeni karşılaştırmayı kabul eden bir Matcher olsaydı? Bu sorunu çözecektir ... ve aslında: eq

when(recommendedAccessor.searchRecommendedHolidaysProduct(eq(metas), any(List.class), any(HotelsBoardBasisType.class), any(Config.class)))
            .thenReturn(recommendedResults);

Bu örnekte 'metas' mevcut bir değer listesidir


5
Muhteşem. org.mockito.Mockito.eq()
javaPlease42

4
doğru içe aktarma artık org.mockito.ArgumentMatchers.eq ()
sam

15

Gelecekte bazılarına yardımcı olabilir: Mockito 'nihai' yöntemlerin alay edilmesini desteklemiyor (şu anda). Bana da aynısını verdi InvalidUseOfMatchersException.

Benim için çözüm, 'nihai' olması gerekmeyen yöntemin ayrı, erişilebilir ve geçersiz kılınabilen bir yöntem haline getirilmesiydi.

İnceleme mockito API kullanımı durumda için.


Bu, kotlin kodumun neden hata vereceğini anlamaya yardımcı oldu, çünkü kotlin'deki tüm yöntemler kesindir!
sorry_I_wont

0

Tüm eşleştiricileri kullanmaya rağmen, aynı sorunu alıyordum:

"org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
Invalid use of argument matchers!
1 matchers expected, 3 recorded:"

Alay etmeye çalıştığım yöntemin sadece statik yöntemi içeren bir sınıfın statik bir yöntemi (örneğin Xyz.class) olduğunu anlamak için biraz zaman aldı ve aşağıdaki satırı yazmayı unuttum:

PowerMockito.mockStatic(Xyz.class);

Belki de sorunun nedeni olabileceği için başkalarına da yardımcı olacaktır.


0

Benim durumum için, bir package-accessyöntemi alay etmeye çalıştığım için istisna ortaya çıktı . Ben gelen yöntem erişim düzeyini değiştiğinde packageiçin protectedistisna gitti. Örneğin Java sınıfının altında,

public class Foo {
    String getName(String id) {
        return mMap.get(id);
    }
}

alay mekanizmasının (alt sınıflandırma) çalışabilmesi için yöntemin AT LEAST seviyesinde String getName(String id)olması gerekir . protected

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.