Test expected an Exception, Exception was thrown (it shows in the output) but test failed anyway

[亡魂溺海] 提交于 2020-01-22 02:18:09

问题


Hi so there's a test for a constructor for a vehicle. The test initializes a vehicle with a driver without a driving license and it should throw an Exception. code constructor:

public Voertuig(String Merk, Datum datumEersteIngebruikname, int Aankoopprijs, int Zitplaatsen, Mens bestuurder, Mens ... ingezetenen) {
    this.nummerplaat = div.getNummerplaat();
    this.Zitplaatsen = Zitplaatsen;
    try {

        this.Merk = Merk;
        this.datumEersteIngebruikname = datumEersteIngebruikname;
        this.Aankoopprijs = Aankoopprijs;
        if (!Arrays.asList(bestuurder.getRijbewijs()).contains(Rijbewijs.B) || !Arrays.asList(bestuurder.getRijbewijs()).contains(Rijbewijs.BE)) {
            throw new MensException("Geen correct rijbewijs");
        } else {
            this.bestuurder = bestuurder;
            Ingezetenen.add(bestuurder);
        }
        Mens[] a = ingezetenen;
        if (a.length > Zitplaatsen - 1) {
            throw new MensException("te veel ingezetenen");
        } else {
            for (int i = 0; i < a.length; i++) {
                ingezetenenExclBestuurder.add(a[i]);
                Ingezetenen.add(a[i]);
            }
        }

    } catch (MensException e) {
        System.out.println(e.getMessage());
    } 
}

code test:

 @Test(expected = be.vdab.util.mens.MensException.class)
    public void test_constructor_zonder_Rijbewijs() {
     //VOERTUIG B,BE//bestuurder:---
        Voertuig voertuig = new TestVoertuig("auto", datum, 18300, AANTAL_INZITTENDEN, INGEZETENE_A);
}  

and when i run this focused test method this is the outcome.

------------- Standard Output ---------------

Geen correct rijbewijs


Testcase: Testcase: test_constructor_zonder_Rijbewijs(be.vdab.voertuigen.VoertuigTest): FAILED
Expected exception: be.vdab.util.mens.MensException
junit.framework.AssertionFailedError: Expected exception: be.vdab.util.mens.MensException

So according to the Output the Exception is caught and displayed but yet the test failed. Anybody knows why? Thanks in advance.

EDIT: I fixed it by not including a try-catch block but just throwing the exception resulting in having to add 'throws MensException' in every test-method where it was creating an object. I fixed this by adjusting my custom MensException, instead of extending Exception i had it extend RuntimeException so i didn't have to add 'throws MensException' in every test-method.


回答1:


In your method, you're capturing the exception and logging the message (which is a bad practice, you should log the stacktrace) and in your test you state that the execution of the test must throw a be.vdab.util.mens.MensException without being catched.

Just re throw it or don't catch it at all in the method/constructor being tested.

Option 1:

public Voertuig(/*  ...your arguments here... */) {
    this.nummerplaat = div.getNummerplaat();
    this.Zitplaatsen = Zitplaatsen;
    try {
        //...
        //code in the try...
        //...
    } catch (MensException e) {
        //System.out.println(e.getMessage());
        //use a logger, not System.out
        //in case you still want to use System.out
        //then at least use the code shown below
        //e.printStackTrace(System.out);
        //line above commented since there's no need to log
        //and rethrow the exception
        //the exception will be handled by the highest level execution
        //and there it should be logged or use another strategy
        throw e;
    } 
}

Option 2:

public Voertuig(/*  ...your arguments here... */) {
    this.nummerplaat = div.getNummerplaat();
    this.Zitplaatsen = Zitplaatsen;
//remove the try
//    try {
    //...
    //code in the try...
    //...
//remove the catch
//    } catch (MensException e) {
//        System.out.println(e.getMessage());
//    } 
}

IMO I would use option 2 rather than option 1.




回答2:


You are actually catching the exception in the catch block. That's why your test failed not getting the expected exception.




回答3:


Here:

    } catch (MensException e) {
        System.out.println(e.getMessage());
    } 

You catch the exception so it is not thrown to the test class.

Change to to:

} catch (MensException e) {
    System.out.println(e.getMessage());
    throw e
} 


来源:https://stackoverflow.com/questions/28118207/test-expected-an-exception-exception-was-thrown-it-shows-in-the-output-but-te

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!