2017-03-01 30 views
2

私のbeanのコンポーネントテストを書いていますが、メソッドのためにNullPointerExceptionsが常に得られます。FacesContextです。FacesContextのJmockitモックaddMessageメソッド

addMessage()メソッドが原因であると確信しています。なぜなら、テストをパスする行が削除されてしまうからです。 addMessage()メソッドをどうやって模擬しますか?

TrendBean

@Named(value = "trendBean") 
@ViewScoped 
@SuppressWarnings("deprecation") 
public class TrendBean extends AbstractBean implements Serializable { 

private static final long serialVersionUID = -310401000218411384L; 

private static final Logger logger = Logger.getLogger(TrendBean.class); 

private ChartPoint point; 

private List<ChartPoint> points; 

@Inject 
private ITrendManager manager; 


public String addChartPoint() { 
    if (!isLoggedIn()) { 
     return null; 
    } 
    assertNotNull(point); 
    final User user = getSession().getUser(); 
    manager.addPointToUser(user, point); 
    FacesContext.getCurrentInstance().addMessage(
      null, 
      new FacesMessage(FacesMessage.SEVERITY_INFO, 
       getTranslation("pointAdded"), "")); 
    init(); 
    return null; 
    } 
} 

TrendBeanTest

public class TrendBeanTest { 

@Tested 
TrendBean trendBean; 
@Injectable 
LoginBean loginBean; 
@Injectable 
Session session; 
@Injectable 
ITrendManager manager; 
@Injectable 
IUserManager userManager; 
@Injectable 
User user; 

@Test 
public void testAddChartPoint(@Mocked FacesContext fakeContext) { 

    new NonStrictExpectations() { 

     { 
      session.isLoggedIn(); 
      result = true; 
      session.getUser(); 
      result = user; 
      manager.addPointToUser((User) any, (ChartPoint) any); 
      FacesContext.getInstance(); 
      result = fakeContext; 
     }; 
    }; 

    Deencapsulation.setField(trendBean, "point", new ChartPoint()); 

    assertEquals(null, trendBean.addChartPoint()); 

    } 
} 

T内側として、この場合

public abstract class AbstractBean { 

private static final Logger logger = Logger.getLogger(AbstractBean.class); 

@Inject 
private Session session; 


public boolean isLoggedIn() { 
    return session.isLoggedIn(); 
} 

protected Session getSession() { 
    return session; 
} 

public String getTranslation(final String messageKey, 
     final Object... formatParameters) { 
    return getTranslation(getLanguage(), assertNotNull(messageKey), 
      assertWithoutNull(formatParameters)); 
} 

public static String getTranslation(final Locale locale, final String messageKey, 
     final Object... formatParameters) { 
    try { 
     final ResourceBundle bundle = ResourceBundle.getBundle(
       "internationalization.messages", assertNotNull(locale)); 
     return getTranslation(bundle, assertNotNull(messageKey), 
       assertNotNull(formatParameters)); 
    } catch (final MissingResourceException e) { 
     assertNotNull(logger) 
       .error(String.format(
         "Severe internationalization error: Internationalization bundle for locale '%s' not found!", 
         locale.toString()), e); 
    } 
    return String.format("No message found for key '%s'!", messageKey); 
} 
+0

おそらく問題はgetTranslation( "pointAdded")ですか? – Alfergon

+0

ちょっとAlfergon、私はこのメソッドのコードを追加しました。私は 'ResourceBundle'も模倣する必要がありますか? – Dos

+0

この場合、あなたは@Mocked AbstractBeanを使ってgetTranslation()メソッドをモックできたと思います。 – Alfergon

答えて

0

AbstractBean彼はFacesContext.getCurrentInstance().addMessageに電話し、AbstractBean .getTranslation(String)と呼んでも、その方法を模擬する必要があります。

このような何か:

TrendBeanTest

public class TrendBeanTest { 

@Tested 
TrendBean trendBean; 
@Injectable 
LoginBean loginBean; 
@Injectable 
Session session; 
@Injectable 
ITrendManager manager; 
@Injectable 
IUserManager userManager; 
@Injectable 
User user; 

@Test 
public void testAddChartPoint(@Mocked FacesContext fakeContext, @Mocked AbstractBean abstractBean) { 

    new NonStrictExpectations() { 

     { 
      session.isLoggedIn(); 
      result = true; 
      session.getUser(); 
      result = user; 
      manager.addPointToUser((User) any, (ChartPoint) any); 
      FacesContext.getInstance(); 
      result = fakeContext; 
      abstractBean.getMessage(anyString); result = "foo"; 
     }; 
    }; 

    Deencapsulation.setField(trendBean, "point", new ChartPoint()); 

    assertEquals(null, trendBean.addChartPoint()); 

    new Verifications(){{ 
     fakeContext.addMessage(withNull(), (FacesMessage)any); 
    }}; 
} 
} 

注:私はので、多分、私は何かをに上書きしてきた、無IDEで私の頭の上からこれをやっています。

関連する問題