Java 测试中的JUnit捕获异常

Java 测试中的JUnit捕获异常,java,testing,junit,Java,Testing,Junit,这就是我的问题:我得到了一个应用程序,我必须编写测试用例,以便使用JUnit对其进行测试。例如:使用属性字符串名称实例化对象,并且此字段不能超过10个字符。如何将其纳入测试方法?这是我的密码: 要测试的类别为: package hdss.io; import hdss.exceptions.HydricDSSException; public class AquiferPublicData implements WaterResourceTypePublicData { privat

这就是我的问题:我得到了一个应用程序,我必须编写测试用例,以便使用JUnit对其进行测试。例如:使用属性
字符串名称
实例化对象,并且此字段不能超过10个字符。如何将其纳入测试方法?这是我的密码: 要测试的类别为:

package hdss.io;

import hdss.exceptions.HydricDSSException;

public class AquiferPublicData implements WaterResourceTypePublicData {
    private String myName;
    private float currentHeight;

    public AquiferPublicData (String name, float current)   throws HydricDSSException{

        try {
            if(name.length()>10) //name must be shorter than 11 chars
                throw new HydricDSSException("Name longer than 10");
            else{
                myName = name;      
                currentHeight = current;
            }
        } catch (HydricDSSException e) {            
        }
    }

    public String getMyName() {
        return myName;
    }
}
我的测试方法是:

package hdss.tests;

import static org.junit.Assert.*;

import org.junit.Test;

import hdss.exceptions.HydricDSSException;
import hdss.io.AquiferPublicData;

public class AquiferPublicDataTest {

    @Test
    public void testAquiferPublicData() {
        String notValidName = "this-name-is-too-long";
        try {
            AquiferPublicData apd = new AquiferPublicData(notValidName, 10);
            fail("Was supposed to throw Exception if name is longer than 10 chars");
        } catch (HydricDSSException e) {
            assertEquals("Name longer than 10", e.getMessage());
        }
    }

}
例外情况是:

package hdss.exceptions;

public class HydricDSSException extends Exception{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    String message;

    //Esfuerzo Actual: 1.5 minutos

    public HydricDSSException (String message){

        this.message = message;
    }

    //Esfuerzo Actual: 1.5 minutos

    public String getMessage(){

        return this.message;
    }

}

您的问题是原始构造函数。你的签名里有一个条款。构造函数中不应该有try/catch块。移除它

public AquiferPublicData (String name, float current)   throws HydricDSSException{
    if(name.length()>10) throw new HydricDSSException("Name longer than 10");
    myName = name;      
    currentHeight = current;
}
您应该编写一个JUnit测试,证明如果名称超过10,就会抛出异常

public class AquiferPublicDataTest {

    @Test
    public void testConstructor_Success() {
        // setup 
        String name = "Jones";
        // exercise
        AquiferPublicData data = new AquiferPublicData(name, 0.0);
        // assert
        Assert.assertEquals(name, data.getMyName());
    }

    @Test(expects = HydricDSSException.class)
    public void testConstructor_NameTooLong() throws HydricDSSException {
        // setup 
        String name = "this one is too long";
        // exercise
        new AquiferPublicData(name, 0.0);
    }
}

如果名称为空,您希望得到什么?允许吗?您现在将得到一个空指针异常。

您的问题是原始构造函数。你的签名里有一个条款。构造函数中不应该有try/catch块。移除它

public AquiferPublicData (String name, float current)   throws HydricDSSException{
    if(name.length()>10) throw new HydricDSSException("Name longer than 10");
    myName = name;      
    currentHeight = current;
}
您应该编写一个JUnit测试,证明如果名称超过10,就会抛出异常

public class AquiferPublicDataTest {

    @Test
    public void testConstructor_Success() {
        // setup 
        String name = "Jones";
        // exercise
        AquiferPublicData data = new AquiferPublicData(name, 0.0);
        // assert
        Assert.assertEquals(name, data.getMyName());
    }

    @Test(expects = HydricDSSException.class)
    public void testConstructor_NameTooLong() throws HydricDSSException {
        // setup 
        String name = "this one is too long";
        // exercise
        new AquiferPublicData(name, 0.0);
    }
}

如果名称为空,您希望得到什么?允许吗?您现在将遇到空指针异常。

在发布问题之前,请确保您已经对IT进行了基本的google搜索,google搜索并尝试实施建议的解决方案,但没有成功。我只是不知道该做什么提示:测试代码中的空catch块
catch(HydrocDSException e){}
。。。那到底是怎么回事?我的意思是:除了默默地放弃你在抛出列表中声明要抛出的错误之外?换句话说:您的第一个bug已经存在了。除此之外:空的捕手挡块很少是个好主意!在你发布问题之前,确保你已经做了一个关于IT的基本谷歌搜索,谷歌搜索并尝试实施建议的解决方案,但没有成功。我只是不知道该做什么提示:测试代码中的空catch块
catch(HydrocDSException e){}
。。。那到底是怎么回事?我的意思是:除了默默地放弃你在抛出列表中声明要抛出的错误之外?换句话说:您的第一个bug已经存在了。除此之外:空的捕手挡块很少是个好主意!我被要求在
public void testConstructor\u NameTooLong()
之后添加
CDSSException
。可以吗?是的,这是正确的。问题:像
NullPointerException
这样的异常是自动抛出的,所以我只需要在我的测试代码中添加:
if(e instanceof NullPointerException){….}
,在
if(e instanceof hydrocdsexception)
之后,对吗?这是错误的。请停止在评论中添加类似的内容。这是关于合同和先决条件的编程。我想说的是,你应该明确你的合同是什么。如果您的对象不接受null或空名称,那么它应该签入构造函数并告诉它们。阅读有关IllegalArgumentException的内容。我被要求在
公共无效测试构造函数\u NameTooLong()之后添加
CDSSException
。可以吗?是的,这是正确的。问题:像
NullPointerException
这样的异常是自动抛出的,所以我只需要在我的测试代码中添加:
if(e instanceof NullPointerException){….}
,在
if(e instanceof hydrocdsexception)
之后,对吗?这是错误的。请停止在评论中添加类似的内容。这是关于合同和先决条件的编程。我想说的是,你应该明确你的合同是什么。如果您的对象不接受null或空名称,那么它应该签入构造函数并告诉它们。阅读有关IllegalArgumentException的信息。