gpt4 book ai didi

java - 如何将模拟对象传递给没有该变量的 setter 或构造函数的类?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:46:50 25 4
gpt4 key购买 nike

Person.java

public class Person
{
private final Integer personID;
private final String personName;
public Person( Integer personID, String personName )
{
this.personID = personID;
this.personName = personName;
}
public Integer getPersonID()
{
return personID;
}
public String getPersonName()
{
return personName;
}
}

PersonDAO.java

public interface PersonDao
{
public Person fetchPerson( Integer personID );
public void update( Person person );
}

**PersonService.java**

public class PersonService
{
private final PersonDao personDao;
public PersonService( PersonDao personDao )
{
this.personDao = personDao;
}
public boolean update( Integer personId, String name )
{
Person person = personDao.fetchPerson( personId );
if( person != null )
{
Person updatedPerson = new Person( person.getPersonID(), name );
personDao.update( updatedPerson );
return true;
}
else
{
return false;
}
}
}

PersionServiceTest.java

public class PersonServiceTest
{
@Mock
private PersonDao personDAO;
private PersonService personService;
@Before
public void setUp()
throws Exception
{
MockitoAnnotations.initMocks( this );
personService = new PersonService( personDAO );
}
@Test
public void shouldUpdatePersonName()
{
Person person = new Person( 1, "Phillip" );
when( personDAO.fetchPerson( 1 ) ).thenReturn( person );
boolean updated = personService.update( 1, "David" );
assertTrue( updated );
verify( personDAO ).fetchPerson( 1 );
ArgumentCaptor<Person> personCaptor = ArgumentCaptor.forClass( Person.class );
verify( personDAO ).update( personCaptor.capture() );
Person updatedPerson = personCaptor.getValue();
assertEquals( "David", updatedPerson.getPersonName() );
// asserts that during the test, there are no other calls to the mock object.
verifyNoMoreInteractions( personDAO );
}
@Test
public void shouldNotUpdateIfPersonNotFound()
{
when( personDAO.fetchPerson( 1 ) ).thenReturn( null );
boolean updated = personService.update( 1, "David" );
assertFalse( updated );
verify( personDAO ).fetchPerson( 1 );
verifyZeroInteractions( personDAO );
verifyNoMoreInteractions( personDAO );
}
}

/* 在上面的示例中,模拟的 personDAO 对象通过 personService 的构造函数(在 personServiceTest 类中)发送到 personService 类对象。

我的疑问是如果模拟的 personDAO 对象没有任何 setter 或构造函数,如何将它传递给 personService 类?

也就是说,如果 personDAO 是使用“new”创建的,而不是像下面代码中提到的那样从 personService 类中的构造函数或 setter 获取,会怎样*/

public class PersonService
{
private final PersonDao personDao=new PersonDao();

public boolean update( Integer personId, String name )
{
Person person = personDao.fetchPerson( personId );
if( person != null )
{
Person updatedPerson = new Person( person.getPersonID(), name );
personDao.update( updatedPerson );
return true;
}
else
{
return false;
}
}
}

如何使用 reflectiontestutils.setfield();

最佳答案

使用 Mockito,您可以通过使用 @Mock@InjectMocks 以及 MockitoJUnitRunner 来做到这一点。

这个问题描述了这个:Using @Mock and @InjectMocks

关于java - 如何将模拟对象传递给没有该变量的 setter 或构造函数的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25932231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com