/*
* Copyright (c) 2007 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockito.internal.util.reflection;
import org.assertj.core.api.Assertions;
import org.junit.Test;
import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Field;
import java.util.UUID;
import static org.junit.Assert.*;
public class BeanPropertySetterTest {
@Test
public void use_the_correct_setter_on_the_target() throws Exception {
// given
SomeBean someBean = new SomeBean();
Field theField = someBean.getClass().getDeclaredField("theField");
File valueToInject = new File("path");
// when
boolean injected = new BeanPropertySetter(someBean, theField, true).set(valueToInject);
// then
assertTrue(injected);
assertTrue(someBean.theFieldSetterWasUsed);
assertSame(valueToInject, someBean.getTheField());
}
@Test
public void use_the_setter_on_the_target_when_field_name_begins_by_at_least_2_caps() throws Exception {
// given
BeanWithWeirdFields someBean = new BeanWithWeirdFields();
Field theField = someBean.getClass().getDeclaredField("UUID");
UUID valueToInject = new UUID(0L, 0L);
// when
boolean injected = new BeanPropertySetter(someBean, theField, true).set(valueToInject);
// then
assertTrue(injected);
assertTrue(someBean.theFieldSetterWasUSed);
assertSame(valueToInject, someBean.UUID);
}
@Test
public void should_not_fail_if_bean_class_declares_only_the_setter_for_the_property() throws Exception {
// given
SomeBeanWithJustASetter someBean = new SomeBeanWithJustASetter();
Field theField = someBean.getClass().getDeclaredField("theField");
File valueToInject = new File("path");
// when
boolean injected = new BeanPropertySetter(someBean, theField, true).set(valueToInject);
// then
assertTrue(injected);
assertTrue(someBean.theFieldSetterWasUsed);
}
@Test
public void should_fail_if_matching_setter_cannot_be_found_and_if_report_failure_is_true() throws Exception {
// given
SomeBeanWithNoSetterMatchingFieldType bean = new SomeBeanWithNoSetterMatchingFieldType();
Field theField = bean.getClass().getDeclaredField("theField");
File valueToInject = new File("path");
try {
// when
new BeanPropertySetter(bean, theField, true).set(valueToInject);
fail();
} catch (Exception e) {
// then
Assertions.assertThat(e.getMessage()).contains("setter not found");
}
}
@Test
public void return_false_if_no_setter_was_found() throws Exception {
// given
SomeBeanWithJustAGetter bean = new SomeBeanWithJustAGetter();
Field theField = bean.getClass().getDeclaredField("theField");
File valueToInject = new File("path");
// when
boolean injected = new BeanPropertySetter(bean, theField).set(valueToInject);
// then
assertFalse(injected);
}
@Test
public void return_false_if_no_setter_was_found_and_if_reportNoSetterFound_is_false() throws Exception {
// given
SomeBeanWithNoSetterMatchingFieldType bean = new SomeBeanWithNoSetterMatchingFieldType();
Field theField = bean.getClass().getDeclaredField("theField");
File valueToInject = new File("path");
// when
boolean injected = new BeanPropertySetter(bean, theField, false).set(valueToInject);
// then
assertFalse(injected);
}
static class SomeBean {
private File theField;
boolean theFieldSetterWasUsed;
public void setTheField(final File theField) {
theFieldSetterWasUsed = true;
this.theField = theField;
}
public File getTheField() {
return theField;
}
}
static class SomeBeanWithJustASetter {
private File theField;
boolean theFieldSetterWasUsed;
public void setTheField(final File theField) {
theFieldSetterWasUsed = true;
this.theField = theField;
}
}
static class SomeBeanWithJustAGetter {
private File theField;
public File getTheField() {
return theField;
}
}
static class SomeBeanWithNoSetterMatchingFieldType {
private File theField;
boolean theFieldSetterWasUsed;
public void setTheField(final FileOutputStream somethingElse) {
theFieldSetterWasUsed = true;
}
}
static class BeanWithWeirdFields {
private UUID UUID;
boolean theFieldSetterWasUSed;
public void setUUID(UUID UUID) {
theFieldSetterWasUSed = true;
this.UUID = UUID;
}
}
}